基础命令练习
- 如何查看
bash
可执行程序所在的位置?
> which bash
/usr/bin/bash
- 如何查看
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.
- 在已经登录的图形用户界面里打开终端窗口会加载哪些配置文件?
通过GUI打开的终端窗口属于交互式 non-login shell,启动时会加载 `~/.bashrc` 文件。
判断下列
shell
的种类。- 右键菜单选择
终端
弹出来的shell
【交互非登录】 - 通过
ssh localhost
得到的shell
【交互登录】 - 以非图形化界面模式登录系统得到的
shell
【交互登录】 - 通过
xterm &
命令得到的shell
【交互非登录】 - 执行脚本时获得的子
shell
【非交互式且默认为非登录式, 如果显式指定登录参数, 例如bash --login/-l
则为登录式】 - 通过
ssh
命令不使用用户名和密码(使用keys
)得到的shell
【交互登录】
- 右键菜单选择
为什么在
bash
中键入ctrl+c
不会退出?
用户在交互式 bash 中键入 ctrl+c 会给整个前台进程组(包括正在前台运行的子 shell)发送 SIGINT 中断信号。
在没有设置 trap 的情况下,bash 会捕获 SIGINT 用于中断循环,不用于退出。
子 shell 是否中断或退出取决于正运行的程序的处理逻辑。
- 显示当前目录栈中的所有记录。
> dirs
- 修改当前用户的命令提示符。
> export PS1="\u@\h \w> "
- 显示缓存的命令
hash
表。
> hash
- 查看系统中当前运行的进程数量。
> ps -aux | wc -l
- 查看当前系统的
hostname
、当前用户的根目录、用户名和终端的种类。
> echo $USER $HOSTNAME $HOME $TERM
- 显示所有运行级别为
3
的开机自启动服务。
> ls /etc/rc.3d/S*
- 完成下述要求并回答问题。
# 创建三个变量 VAR1、VAR2、VAR3
# 分别用于存储 `thirteen` 、 `13` 和 `Happy Birthday`
> VAR1="thirteen";VAR2=13;VAR3="Happy Birthday"
# 展示这些变量
> echo $VAR1 $VAR2 $VAR3
# 这三个变量是全局变量还是局部变量?在其他终端窗口中可以访问吗?
# 局部变量。不能。
# 删除 VAR3
> unset VAR3
- 修改
root
用户的命令提示为危险!你现在的身份是根用户!\w
。
# 修改 /root/.bashrc 文件中的 PS1 变量
危险!你现在的身份是根用户!/home/remilia
- 写一个脚本,接受两个整数并计算以此为边长的矩形的面积。
#!/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
- 让每个新建用户的命令提示变为
新建用户\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
到100
的和。
> echo {1..100} | tr ' ' '+' | bc
5050
- 查询
/etc
路径下的所有名字带数字的文件。
ls /etc | grep [0-9]
ls /etc | grep [[:digit:]]
- 查询家目录下
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'
- 查询
/etc/group
中以daemon
开头的行,标明行号并统计行数。
grep -n 'daemon' /etc/group # 标注行号
grep -c 'daemon' /etc/group # 统计行数
grep 'daemon' /etc/group | wc -l # 统计行数
- 使用
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' $_