重定向
输出重定向
有关输出重定向,举例说明就比如:
$ls -l > lsoutput.txt
这个例子的意思就是,将ls命令操作得到的结果导入到lsoutpu.txt文件中。
这是输出重定向中比较简单的操作,上面的这个例子的结果,在当前目录下不存在lsoutput.txt文件时,创建该文件并将结果置于其中;但在已经存在lsoutput.txt文件的情况下,将会清空该文件再把结果置于其中。由此,将带来一些不必要的麻烦。
在此,Linux提供了一种方法来避免这种麻烦,即通过设置noclobber。操作如下:
set -o noclobber (or set -C)
这样设置之后,就可以避免当lsoutput.txt文件存在时,重定向操作重写该文件。
要取消noclobber的设置,命令如下:
set +o noclobber
除此之外,输出重定向操作还有另一项操作:>> 。例如:
$ps >> lsoutput.txt
它所代表的意思就是,将ps的结果保存在lsoutput.txt文件中,当lsoutput.txt文件不存在时,创建该文件并将结果置于其中,而当lsoutput.txt文件存在时,则将结果保存在该文件的结尾。
上面简单介绍了一下输出重定向操作的两种方式,现在我们再深入了解重定向操作。
在Linux中,分别用三个数字0、1、2来表示重定向操作的三种状态。0代表标准输入、1代表标准输出、2代表标准错误输出。因此,我们通过使用2>来将标准错误输出存放到具体的文件中。比如:
$kill -HUP 1234 >killout.txt 2>killerr.txt
它所表示的意思就是,将进程号为1234的进程杀死,并将结果保存到killout.txt中,将所报的错误保存到killerr.txt中。
如果你想将这两种结果都保存在一个文件中,可以通过操作:
$kill -1 1234 >killout.txt 2>&1
注意操作的顺序,先将标准输出到killout.txt文件中,再将将标准错误输出到该文件中。如果顺序错误的话,将不能得到你所想要的结果。
另外,如果你不想保存标准输出和标准错误输出到文件中,可以通过/dev/null来达到要求。命令如下:
$kill -1 1234 >/dev/null 2>&1
输入重定向
输入重定向操作类似于输出重定向,举例说明:
$more < killout.txt
所表示的意思是,将killout.txt中内容导入到more操作中。
下面是一些重定向的例子:
$ls /dev 1>filename
$ls -qw /dev 2>filename (很明显,qw选项不是ls的参数选项)
$ls /dev &>filename (标准输出和标准错误输出都保存在filename文件中)
$exec 5>&1 (表示把文件标识符5定向到标准输出,这个命令通常用来临时保存标准输入)
接下来是一个具体的操作实例:
#echo 123456789 >filename 把字符串写到文件filename中
#exec 3<>filename 把文件filename打开,并指定文件标识符为3
#read -n 4 <&3 从文件中读4个字符,句柄已经指到第四个字符末尾
#echo -n . >&3 在第5个字符处写一个点,覆盖第5个字符,-n表示不换行
#exec 3>&- 关闭文件标识符3
现在cat filename文件的结果就成了1234.6789
(注:命令j<>filename表示把文件打开,并指明文件标识符为j , “&-”表示关闭文件标识符)
有关关闭文件标识符的操作请参考下面
n<&- 关闭输入文件标识符n
0<&-或<&- 关闭标准输入stdin
n>&- 关闭输出文件标识符n
1>&-或>&-关闭标准输出stdout
另外还有一些其他命令,如下参考
:> filename 或者 > filename
表示把文件filename设置成空,也就是清空文件内容,如果文件不存在,则创建一个空文件,(等同于touch命令) :表示一个空输出,两个命令的唯一区别就是>filename不是在所有shell都可以正常工作的。