输出重定向(覆盖)
通常情况下,所谓的输出重定向是指将原文输出的标准输出的数据输出到其他文件或者设备中。输出重定向的操作符为大于号>,其基本语法如下:
cmd > file
在上面的语法中,cmd表示Shell命令,大于号表示>为重定向操作符,file表示重定向的目标文件。在执行重定向操作的的时候回,如果目标文件file不存在,则重定向操作符>会创建一个名称为file空文件,然后向该文件中写入数据;如果目标文件已经存在,则重定向操作符>会清空原始文件的内容,然后再向该文件写入数据。
实际上,输出重定向操作符还有一种完整的语法
cmd [n]> file
在上面语法中,cmd同样表示Shell命令,n为一个整数,表示文件描述符,大于号为重定向操作符,file为重定向的目标文件。当Shell在执行以上命令时,会将文件file打开,并且与文件描述符n相关联。在执行输出重定向的时候,如果文件描述符被省略的话,则表示重定向的是标准输出。这意味着输出重定向的默认文件描述符为1。所以如下两条指令的作用是相同的。
ls -l /etc > filelist.txt
ls -l /etc 1> filelist.txt
除了将标准输出重定向到文件外,用户还可以将标准错误重定向至指定文件。使用方法如下所示。
#! /bin/bash
ls -lz 2> errmsg.txt
cat errmsg.txt
在该脚本中,标准错误将会被定向至一个名为errmsg.txt的文本文件中,执行该脚本后的结果如下所示。
ls: invalid option -- 'z'
Try 'ls --help' for more information.
在Linux中,/dev/null是一个空设备,任何写入到该设备的数据都将被直接丢弃。因此,如果用户想要把某个命令的输出信息和错误信息完全丢弃,可以将其重定向到/dev/null文件,如下所示(&符号代表标准输出和标准错误):
ls -l &> null
由于重定向操作符>会覆盖原始文件的内容,所以该操作符为用户提供了一个非常实用的技巧,即快速清空一个文件的内容或创建一个空文件,命令如下所示:
> mfile
更为通用的写法为
:> mfile
该命令表示将文件mfile的内容清空;如果该文件不存在,则创建一个空白文件。
绝大部分Shell命令还支持将一组命令的输出重定向,其语法如下所示:
{ cmd1;cmd2;...; } [n]> file
其基本的使用方法为,使用大括号将所有命令包围起来,多条命令之间使用分号隔开。命令与左右大括号之间各保留一个空格,最后一条命令的结尾也要使用分号。例如下面的命令将date和who两个命令的标准输出与标准错误都重定向到名称为message的文件里:
{ date;who; } &> message
输出重定向(追加)
除了覆盖模式外,输出重定向还有一种追加模式,其操作符为“>>”,功能与“>”基本相同,区别在于前者不会覆盖原有文件的内容,而是追加在已有文件内容的后面。该操作符的基本语法如下所示:
cmd [n]>> file
其中cmd表示Shell命令,n为文件描述符,缺省值为1。“>>”同样支持一组命令。
输入重定向
通常情况下,Shell命令会从标准输入,即键盘读取用户输入的数据。但是Shell提供了另一种读取用户输入的机制,即从文件中获取输入,这种机制称作输入重定向,其操作符号位“<”,基本语法如下所示:
cmd < file
其中,cmd表示Shell命令,file文件的内容将作为cmd命令的输入。在下面的指令中,系统将会以explode.py作为输入,计算并输出该脚本文件的行数:
root@main:~/nen# wc -l < explode.py
45