首页 理论教育 输入输出重定向与追加重定向技巧

输入输出重定向与追加重定向技巧

时间:2023-11-18 理论教育 版权反馈
【摘要】:输入重定向的格式为:取cat和wc命令的输入重定向文件为前面提到过的email.txt:不难看出,cat<email.txt和cat email.txt效果不是一样的吗?有必要,后面讲while循环的时候将会再举输入重定向的例子,那时对输入重定向会有更深刻的认识。输入输出重定向通常简称为I/O重定向,I/O是Input(输入)/Output(输出)的意思。这时,如果再将date的输出重定向到time.txt,看看会怎样:因为不是追加重定向,time.txt中的旧内容被冲掉了。输入重定向与输出重定向可以在一条命令里同时使用。

输入输出重定向与追加重定向技巧

使用键盘输入有一个明显的缺点,就是每次都需要用户手工输入,输错的话还要重来,效率不高。其实,输入是可以重定向的,输入可以不来自键盘,而来自文件。输入重定向的格式为:

取cat和wc命令的输入重定向文件为前面提到过的email.txt:

不难看出,cat<email.txt和cat email.txt效果不是一样的吗?cat<email.txt表示cat命令要显示的内容来自文件email.txt(而不是来自键盘的输入),cat email.txt表示要显示文件email.txt的内容,效果是一样的。既然一样,那么介绍输入重定向有必要吗?有必要,后面讲while循环的时候将会再举输入重定向的例子,那时对输入重定向会有更深刻的认识。

命令行的输出默认显示在终端屏幕上,这有时会给用户带来不便。一旦终端shell窗口关闭,或者屏幕经过了长长的滚动,再想查看刚才某条命令行的输出,就不容易了,甚至是不可能了。输出也可以重定向到文件,格式为:

查看文件email.txt的信息,运行ls命令,信息输出在屏幕上:

如果将ls命令的输出重定向到了文件lst.txt,屏幕上将不显示文件email.txt的信息:

ls -l email.txt命令输出了什么?终端屏幕上没有显示,因为ls -l email.txt显示的信息重定向到了文件lst.txt里,查看一下lst.txt就知道了:

下面将date命令的输出先存入文件time.txt,再查看一下time.txt的内容:

只要time.txt文件不被删除,那么运行date命令那一刻的时间就被记录了下来。有时,某些脚本需要运行较长时间又需要计时。此时可以在脚本的第一句写命令date>start_time;在脚本的逻辑上的最末一句,或者说在脚本结束的地方,写命令date>end_time;根据文件start_time和end_time中记录的时间,可以计算出脚本的总运行时间。

输入输出重定向通常简称为I/O重定向,I/O是Input(输入)/Output(输出)的意思。

输出还可以追加重定向,输出追加重定向的格式为(注意两个大于号之间不能有空格):

接着前面的例子,再次运行date,将此刻date命令的输出追加到time.txt文件:

第二次运行date时的时间被追加存到了time.txt中。这时,如果再将date的输出重定向(而不是追加重定向)到time.txt,看看会怎样:

因为不是追加重定向,time.txt中的旧内容被冲掉了。运行date>time.txt时,新的时间存入time.txt文件,覆盖了原有的内容。所以在输出重定向到某个文件之前,最好先检查文件是否已经存在(在命令行,可以用命令ls检查;学习完第5章的判断命令后,就可以知道在脚本里如何检查了)。(www.xing528.com)

下面使用cat命令将键盘输入重定向到文件file1.txt,按〈Ctrl+D〉键结束键盘输入:

再将键盘输入重定向到文件file2.txt,按〈Ctrl+D〉键结束键盘输入:

文件file1.txt和file2.txt就产生了。可以将file1.txt与file2.txt合并为一个新文件:

cat命令的参数file1.txt在file2.txt的前面,所以file1.txt的内容在前,file2.txt的内容在后,组成了新文件file.txt。查看一下新文件的内容:

也可以将file1.txt的内容追加到file2.txt的后面,那么file2.txt的内容就更新了,file2.txt的前半部分内容是它原来的,后半部分内容来自file1.txt:

cat可以将更多的文件合并为一个新文件,如,cat file1 file2 file3>file,三个文件的内容按照顺序连接在一起组成新文件file。也可以将更多的文件按照顺序连在一起并追加到某个文件的尾部,如,cat file1 file2 file3 file4 file5>>file。现在知道cat命令的名字是怎么来的了,它是catenate或concatenate(连接)的缩写。

Bash还识别一种特殊的输出重定向:大于号的左边没有命令(空操作),右边跟一个文件名。即:

例如:

文件file.txt不存在时,命令“>file.txt”将产生一个新的空文件file.txt;如果file.txt事先已经存在,file.txt原有的内容将消失,字节数变为0。除了touch命令之外,这里又介绍了一种产生新的空文件的方法。注意,file.txt事先不存在的话,命令>file.txt与命令touch file.txt效果相同;file.txt事先存在的话,命令touch file.txt只改变了文件的时间戳,文件内容不受影响,命令>file.txt将文件的内容清空(文件字节数变为0),当然也同时改变文件的时间戳。

输入重定向与输出重定向可以在一条命令里同时使用。例如,将文件email.txt复制到email_bak.txt,当然会首先想到命令:cpemail.txtemail_bak.txt。其实还可以用下面的命令:

这条命令的意思是,将文件email.txt作为命令cat的输入,命令cat显示出来的email.txt的内容被重定向到email_bak.txt(而不是终端屏幕),这样的话,email_bak.txt的内容与email.txt完全一致:

复制文件用命令cpfile1file2,catfile1>file2和cat<file1>file2都是可以的。一定不要认为cat<file1>file2中的两个重定向符号是一对普通的尖括号。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈