基础命令练习

  1. 如何查看 bash 可执行程序所在的位置?
> which bash
/usr/bin/bash
  1. 如何查看 bash 的版本信息?
> bash --version
GNU bash, version 5.0.3(1)-release (x86\_64-pc-linux-gnu)  
Copyright (C) 2019 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later   

This is free software; you are free to change and redistribute it.  
There is NO WARRANTY, to the extent permitted by law.
  1. 在已经登录的图形用户界面里打开终端窗口会加载哪些配置文件?
通过GUI打开的终端窗口属于交互式 non-login shell,启动时会加载 `~/.bashrc` 文件。
  1. 判断下列 shell 的种类。

    • 右键菜单选择 终端 弹出来的 shell 【交互非登录】
    • 通过 ssh localhost 得到的 shell 【交互登录】
    • 以非图形化界面模式登录系统得到的 shell 【交互登录】
    • 通过 xterm & 命令得到的 shell 【交互非登录】
    • 执行脚本时获得的子 shell 【非交互式且默认为非登录式, 如果显式指定登录参数, 例如 bash --login/-l 则为登录式】
    • 通过 ssh 命令不使用用户名和密码(使用 keys )得到的 shell 【交互登录】
  2. 为什么在 bash 中键入 ctrl+c 不会退出?

用户在交互式 bash 中键入 ctrl+c 会给整个前台进程组(包括正在前台运行的子 shell)发送 SIGINT 中断信号。
在没有设置 trap 的情况下,bash 会捕获 SIGINT 用于中断循环,不用于退出。
子 shell 是否中断或退出取决于正运行的程序的处理逻辑。
  1. 显示当前目录栈中的所有记录。
> dirs
  1. 修改当前用户的命令提示符。
> export PS1="\u@\h \w> "
  1. 显示缓存的命令 hash 表。
> hash
  1. 查看系统中当前运行的进程数量。
> ps -aux | wc -l
  1. 查看当前系统的 hostname 、当前用户的根目录、用户名和终端的种类。
> echo $USER $HOSTNAME $HOME $TERM
  1. 显示所有运行级别为 3 的开机自启动服务。
> ls /etc/rc.3d/S*
  1. 完成下述要求并回答问题。
# 创建三个变量 VAR1、VAR2、VAR3
# 分别用于存储 `thirteen` 、 `13` 和 `Happy Birthday` 
> VAR1="thirteen";VAR2=13;VAR3="Happy Birthday"
# 展示这些变量
> echo $VAR1 $VAR2 $VAR3
# 这三个变量是全局变量还是局部变量?在其他终端窗口中可以访问吗?
# 局部变量。不能。
# 删除 VAR3
> unset VAR3
  1. 修改 root 用户的命令提示为 危险!你现在的身份是根用户!\w
# 修改 /root/.bashrc 文件中的 PS1 变量
危险!你现在的身份是根用户!/home/remilia
  1. 写一个脚本,接受两个整数并计算以此为边长的矩形的面积。
#!/usr/bin/bash

if [ ! 2 -eq $# ]; then
    echo "you must give 2 var"
elif ! [ $1 -gt 0 2>/dev/null ]; then
    echo "\$1 must be integer greater than 0"
elif ! [ $2 -gt 0 2>/dev/null ]; then
    echo "\$2 must be integer greater than 0"
else
    echo "area $(( $1 * $2 ))"
fi
  1. 让每个新建用户的命令提示变为 新建用户\u\w\$
在使用 adduser 新建用户时, 默认会将 /etc/skel 目录下的所有文件拷贝到新用户的家目录下,因此我们应该将当前用户的 `.bashrc` 拷贝到这个目录下并修改 PS1 变量。
> sudo cp ~/.bashrc /etc/skel
# 修改 PS1 的值为 `新建用户\u\w\$ '
> sudo adduser aqua
> su aqua
新建用户aqua~$ exit
> sudo userdel -r aqua
  1. 尝试用管道计算 1100 的和。
> echo {1..100} | tr ' ' '+' | bc
5050
  1. 查询 /etc 路径下的所有名字带数字的文件。
ls /etc | grep [0-9]
ls /etc | grep [[:digit:]]
  1. 查询家目录下 10 小时内修改过的文件(不包括文件夹)。
# 用 touch + find
touch time.marker -d '10 hours ago'  # 建立一个最后修改时间为 10 小时前的文件
find ~ -maxdepth 1 -type f -newer time.marker  # 最大深度 1,类型为文件

# 用 find
find ~ -maxdepth 1 -type f -newermt '10 hours ago'
  1. 查询 /etc/group 中以 daemon 开头的行,标明行号并统计行数。
grep -n 'daemon' /etc/group  # 标注行号
grep -c 'daemon' /etc/group  # 统计行数
grep 'daemon' /etc/group | wc -l  # 统计行数
  1. 使用 sed 列出 /usr/bin 路径下所有第二个字符为 a 的文件,将结果存入临时文件中,然后删除该文件的前三行,最后显示所有包含 an 的行。
> ls /usr/bin | sed -n '/^.a/p' > /tmp/$sed.tmp
> sed -n '1,+2d' /tmp/$sed.tmp
> sed -n '/an/p' $_

results matching ""

    No results matching ""