Shell应用技巧
Linux系统为Shell的使用设置了一些技巧,掌握这些技巧将使Shell的使用更加简单、方便,下面我们对Shell应用技巧中的重定向、管道和命令连接符进行讲解。
1、 输入/输出重定向
Shell默认可接收用户输入到终端的命令,并在执行后将错误信息和输出结果打印到终端,但在实际应用中,并非任何情境下我们都希望Shell执行这项默认操作,此时,可通过Linux系统提供的一些功能,改变Shell获取信息和输出信息的方向。
Linux系统中的输入输出分为以下三类:
(1)标准输入(STDIN)。标准输入文件的编号是0,默认的设备是键盘,命令在执行时从标准输入文件中读取需要的数据。
(2)标准输出(STDOUT)。标准输出文件的编号是1,默认的设备是显示器,命令执行后其输出结果会被发送到标准输出文件。
(3)标准错误(STDERR)。标准错误文件的编号是2,默认的设备是显示器,命令执行时产生的错误信息会被发送到标准错误文件。
Linux允许对以上三种资源重定向。所谓重定向,即使用用户指定的文件,而非默认资源(键盘、显示器)来获取或接收信息。下面分别针对以上的三种文件,讲解其重定向的方法。
① 输入重定向
输入重定向运算符“<”可以指定其右值为左值的输入,具体格式如下:
命令 < 文件名
以wall命令为例,示例如下:
wall < file
当执行以上命令时,系统会将文件file中的内容作为命令“wall”的输入,发送给所有用户。
② 输出重定向
输出重定向运算符“>”可以将其右值作为左值的输出端,其格式如下:
命令 > 文件名
以cat命令为例,示例如下:
cat /etc/passwd > file
当系统执行以上命令时,会清空file文件中原始的内容,并将命令“cat /etc/passwd”的结果输出到file文件中。若想保留file文件的内容,可以使用“>>”运算符,以追加的形式将结果输出到file文件。示例如下:
cat /etc/passwd >> file
③ 错误重定向
错误重定向也使用输出重定向运算符“>”,重定向错误输出的方式与输出重定向的方式略有不同,其格式如下:
command 2>filename
以gcc命令为例,示例如下:
gcc –c hello.c –o hello 2>file
当系统执行以上命令时,会将执行“gcc –c hello.c –o hello”命令时产生的错误输出到文件file中。同样的,错误重定向也可以使用运算符“>>”,以追加的方式将错误输出到指定的文件。示例如下:
gcc –c hello.c –o hello 2>>file
关于此部分知识,还有两点需要注意:
第一,在错误重定向中使用到了标准错误文件的编号2,其实在输入/输出重定向中,也可以添加对应的文件编号,如在①②中的示例,分别可写为如下形式:
wall 1<file
cat /etc/passwd 2>file
cat /etc/passwd 2>>file
只是当其出现在重定向符号左侧时,可以被省略。
第二,需要掌握运算符“&”的用法。该运算符表示“等同于”,如“2>&1”,表示将标准错误的输出重定向到指定的标准输出文件。若在此之前,标准输出文件已被修改,则命令执行过程中的错误不会输出到默认的标准输出文件,而是输出到当前指定的标准输出文件。
比如,现在有一空设备文件null,首先执行以下命令,指定标准输出重定向到该空文件:
1>/dev/null
之后再将标准错误重定向等同于标准输出:
2>&1
则由于标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
2、 管道
管道可以将多个简单的命令连接起来,使一个命令的输出,作为另外一个命令的输入,由此来实现更加复杂的功能。管道的符号为“|”,格式如下:
命令1 | 命令2 |…| 命令n
以ls命令和grep命令的组合为例:
ls –l /etc | grep init
在以上示例中,管道符“|”连接了ls命令和grep命令,其作用为:输出etc目录下目录信息包含“init”关键字的行。若不使用管道,则必须使用两步来完成这个任务,具体步骤如下:
ls –l /etc > tmp.txt
grep init < tmp.txt
3、 命令连接符
想必大家在高级语言的学习中,都已经见过诸如“;”、“&&”、“||”这些符号,这里要学习这些符号在Shell编程中的用法。
① 使用“;”运算符间隔的命令,会按照先后次序依次执行。
假如现在有一系列确定的操作需要执行,且这一系列操作的执行需要耗费一定时间,比如安装gdb包时,在下载好安装包后,还需要逐个执行以下命令:
tar –xzvf gdb-7.11.1.tar.gz
cd gdb-7.11.1
./configure
make
make install
gdb -v
且在大多数命令开始执行后,都需要一定的时间,等待命令执行完毕。若此时使用“;”连接符,连接这些命令:
tar -xzvf gdb-7.11.1.tar.gz ;cd gdb-7.11.1;./configure;make;make
install;gdb -v
那么系统会自动执行这一系列命令。
② 使用“&&”连接符连接的命令,其前后命令的执行遵循逻辑与关系,只有该连接符之前的命令执行成功后,它后面的命令才被执行。
③ 使用“||”连接符链接的命令,其前后命令的执行遵循逻辑或关系,只有该连接符之前的命令执行失败时,才会执行后面的命令。