日常应用中,Linux 下我们接触得最多的 Shell 恐怕非 Bash 莫属了,相信熟悉使用了 Bash 以后,要掌握其他 Shell 的使用,应该易如反掌。这一节我们着重介绍一下 Bash 的基本功能、特点以及它所包含的命令。
一、Bash 的功能概述
Bash 是绝大多数版本的 Linux 系统下默认的 Shell ,全名为 Bourne Again Shell 。它功能强大,那么接下来我们将围绕 Bash 的六大优点来对其进行深入了解。
1、历史记录:
执行 history 命令,Bash 将为我们列出最近使用的 1000 个命令,列表中编号数字越大的表示其被使用的时间越接近当前。
1171 lsof | grep Flash 1172 cat /proc/2367/fd/39 > 01.flv 1173 cat /proc/2367/fd/40 > 02.flv 1174 cat /proc/2367/fd/41 > 03.flv 1175 cat /proc/2367/fd/42 > 04.flv 1176 mencoder -ovc copy -oac mp3lame 01.flv 02.flv 03.flv 04.flv -o 每天一苹果.flv 1177 cd linux/linux100/
上图是 history 命令输出的历史命令中的一部分,前面的数字便是编号,使用“!编号”命令可以重新执行历史命令列表中指定编号所对应的命令,使用“!!”命令可以重新执行上一条命令,使用“!关键字”命令可以重新执行历史命令列表中以关键字开头且时间最接近的命令。
需要注意的是,刚装的系统或者新建用户的历史命令数量可能不足 1000 个,这里的 1000 是 Bash 的预设值,我们可以使用 “echo $HISTSIZE”命令来查询历史命令存储量上限值,也可以在 /etc/profile 中更改这个上限值。下面我们来演示一下如何更改这个上限值为 8000 。
trevor@trevor-PC:~$ echo $HISTSIZE 1000 trevor@trevor-PC:~$ sudo vi /etc/profile trevor@trevor-PC:~$ source /etc/profile trevor@trevor-PC:~$ echo $HISTSIZE 8000 trevor@trevor-PC:~$
上图中,echo 命令开始查看到历史命令存储上限值为 1000,然后使用管理员权限修改 /etc/profile 文件(若文件中已经有“HISTSIZE=”,更改等号后面的值即可,否则直接在文件最后添加一行“HISTSIZE=8000”),文件保存退出后,执行 source 命令让配置在重启系统前立马生效,再次执行 echo 命令查看历史命令存储上限值,可以看到这个上限值修改成功了。
我们不禁要问,这些历史命令究竟保存在哪个文件当中呢?它其实就保存在用户家目录下的隐藏文件“.bash_history”中,所以如果您想删除历史记录,既可以将 HISTSIZE 设置为 0,也可以删除家目录下的“.bash_history”文件。
2、命令与档案补全:
在 Shell 中执行命令的时候,有些命令、文件名或目录名太过复杂难记,这时候可以借助 Tab 键来帮忙补全。例如我们想输入 ifconfig 命令,但是只记得前两个字母 if,输入 if 后,按下 Tab 键,系统也许不会有反应,但是再按一次系统就会列出所有以 if 开头的命令;如果输入的是前四个字母 ifco ,按下 Tab 键,因为可能的命令只剩下一个,系统将自动补全 ifconfig 。除了命令之外,Tab 键还还可以补全文件名或者目录名。
3、别名:
别名的功能有些像快捷方式,即使用一个简单好记的字符串来取代过长的命令。例如,查看路由命令“netstat -nr”比较难记,想用别名 nr 来取代,则可以使用 alias 命令来创建别名,如下图所示:
trevor@trevor-PC:~$ netstat -nr 内核 IP 路由表 Destination Gateway Genmask Flags MSS Window irtt Iface 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 192.168.50.100 0.0.0.0 UG 0 0 0 eth0 trevor@trevor-PC:~$ nr 程序“nr”尚未安装。 您可以使用以下命令安装: sudo apt-get install netrw trevor@trevor-PC:~$ alias nr="netstat -nr" trevor@trevor-PC:~$ nr 内核 IP 路由表 Destination Gateway Genmask Flags MSS Window irtt Iface 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 192.168.50.100 0.0.0.0 UG 0 0 0 eth0 trevor@trevor-PC:~$
另外,可以使用 alias 命令查看目前正在使用的别名列表,还可以使用“alias 别名”命令来查询指定别名所对应的真正命令。
4、工作控制:
在 Bash 中运行程序以后,倘若程序尚未退出,此时的 Bash 正关注着系统为该程序所分配的进程,在该程序未结束、终止、暂停或者被移至后台执行之前,是无法运行其他程序的。
“Ctrl+c”可以终止目前正在运行的程序;“Ctrl+z”可以暂停目前正在运行的程序,将其移至后台。前台与后台的差别在于,前台能够接受使用者的操作而后台不能。使用 jobs 命令可以查看当前后台有哪些程序,每个程序之前都对应一个编号。使用“fg %编号”命令可以将后台的程序移到前台运行,使用“bg %编号”命令则使后台暂停的程序变为后台执行状态,若不指定编号,则默认选择时间临近的一个程序执行。如果想让程序直接后台运行,可以在执行命令最后加上后台运行符“&”。
5、脚本:
脚本允许使用者将众多命令及参数集合而成一个可以一次性完成的 Shell Script 。例如管理员要在每个使用者的家目录下建立 10 个不同的文件跟目录,同时删去指定文件,这种情况下,倘若用户数量庞大,使用 Shell 脚本来批量执行命令,可以极大地提高管理员的工作效率。
6、万用字元:
万用字元即星号“*”,Bash 将“*”视为任意字符,单独的“*”被视作“所有”之意。在某些场景下,用户可以借助它来达到事半功倍的效果。例如,我们想复制当前目录下所有的 Word 文档到 Document 目录,执行 “cp *.doc Document” 即可。
二、Bash 的命令
这里要讲到的 Bash 的命令主要是指 Bash 的内嵌命令,这些命令集成在可执行文件 /bin/bash 中,故有部分命令在 /bin 跟 /usr/bin 目录中找不到,它们的执行速度比系统目录下的同名命令要快,这里简要介绍一下 Bash 的内嵌命令及其功能。
cd [arg]:切换目录,如果不带参数,则进入主目录,否则切换到参数所大指定的目录。
declare [var]:显示所有变量,或用可选属性声明变量。
dirs:显示相对路径,“~”表示家目录。
disown:从当前后台程序列表中删除任务,默认删除最近任务。
echo [args]:显示 args 指定的文件或字符串并换行。
enable:启用或禁用 Shell 内置的命令。
eval [args]:将 args 读入 Shell ,并执行产生的命令。
exec command:执行 command 命令,替换掉当前 Shell。
exit [n]:将 n 作为返回值来退出 Shell。
export [var]:使变量 var 可被子 Shell 识别。
fc:历史的修改命令,用于编辑历史命令。
fg:把后台作业放到前台。
getopts:解析并处理命令行选项。
hash:控制用于加速命令查找的内部哈希表。
help [command]:显示关于内置命令的帮助信息,如果指定了 command 命令,则将显示 commad 命令的详细信息。
history:显示或操纵历史列表。
jobs:显示任务状态。
kill [-signal] PID:向由 PID 指定的进程发送 signal 信号。
let:用来计算算术表达式的值,并把算术运算的结果赋给变量。
local:用在函数中,把变量的作用域限制在函数内部。
logout:退出登录 Shell。
popd:从栈中删除目录。
pushd:将目录添加到栈中。
pwd:打印出当前的工作目录。
read [var]:从标准输入读取一行,保存到变量 var 中。
readonly [var]:将变量 va r设为只读,不允许重置该变量。
return [n]:从函数中退出,并返回 n。
set:设置选项和位置参量。
shift [n]:将位置参量左移n次。
stop PID:暂停第 PID 号进程的运行。
suspend:挂起 Shell 执行。
test:检查文件类型,并计算条件表达式。
times:显示由当前 Shell 启动的进程运行所累计用户时间和系统时间。
trap [arg] [n]:当 Shell 收到信号 n(n为0、1、2或15)时,执行 arg。
type [command]:显示命令的类型,例如:pwd 是 Shell 的一个内置命令。
typeset:同declare,设置变量并赋予其属性。
ulimit:显示或设置进程可用资源的最大限额。
umask [八进制数字]:设置用户文件关于属主、属组和其他用户的创建模式掩码。
unalias:取消所有的命令别名设置。
unset [name]:取消指定变量的值或函数的定义。
wait [pid]:等待进程号为 pid 的后台进程结束,并报告它的结束状态。
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。