重定向 (计算机)
在计算机领域,重定向是大多数命令行解释器所具有的功能,包括各种可以将标准流重定向用户规定地点的Unix shells。类Unix操作系统的程序可以透過dup2(2)系统调用完成重定向,或者透過缺少一些灵活性但是更高一级层次的freopen(3)和popen(3)来完成。
重定向标准输入输出
重定向一般透過在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:
command1 >file1
上面这个命令执行command1然后将输出的内容存入file1.注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。
command1 <file1
执行command1,使用file1作为用来替代键盘的输入源。
command1 <infile > outfile
同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
管道
多个程序可以一起运行,一个程序可以直接将另外一个程序的输出作为其输入,并且不需要借助中间文件:
command1 | command2
执行command1,将其输出作为command2的输入。这种方式被称为管道,因为"|"字符被称为"管道"。这种方式的结果和使用2个重定向及一个临时文件的方式相等价:
command1 > tempfile
command2 < tempfile
rm tempfile
但是使用管道的时候两个命令是同时执行的,较为省时。
一个使用命令管道的很好例子是使用echo和另外一个命令达到在一个非交互式shell中达到一定的交互效果:
echo -e "user\npass" | ftp localhost
这个例子运行ftp客户端,然后输入用户名,回车,然后再输入密码。
标准文件句柄的重定向
源自Bourne shell的许多Unix shell,可以将一个数字(文件描述符)放在重定向符号前,这样可以影响用于重定向的数据流。Unix的标准输入输出流是:
Handle | Name | Description |
---|---|---|
0 | stdin | 标准输入 |
1 | stdout | 标准输出 |
2 | stderr | 标准错误输出 |
例如:
command1 2> file1
执行command1,然后将标准错误输出重定向到文件file1
一些源自csh的shells,将&符号放在重定向符号后,达到同样的效果。这样做的原因是为了将标准输出与文件名为'1'的文件区分开来。例如对于'cat file 2>1'和'cat file 2>&1',前者会将错误输出重定向至叫做'1'的文件,后者则将其重定向至标准输出。
另外一个很有用的功能是将一个标准文件句柄重定向到另一个。最流行的一种用法是将标准错误输出融合到标准输出中去,这样错误信息可以和其他普通的输出信息一起处理。例如:
find / -name .profile > results 2>&1
上面这个命令会找到所有名字为.profile的文件。如果没有重定向,它会输出结果到标准输出,错误(例如在遍历过程中缺少访问某些受保护目录的权限)到标准错误输出。如果标准输出被重定向到一个文件,那么错误信息就会出现在控制台上。通过使用重定向2>&1,输出的结果和错误信息都被写入了文件results.
可以将2>&1放置在">"前,但是这样并不能达到我们想要的效果。因为当解释器读到2>&1, 它并不知道标准输出已经被重定向到哪裡,所以标准错误输出并没有和标准输出融合。
如果融合过的输出通过管道作为另外一个程序的输入,那么这个融合2>&1必须在管道符号之前:
find / -name .profile 2>&1 | less
一个命令
command > file 2>&1
的简化版本 (不使用于bourne shell)
command &>file
或者
command >&file
连锁管道
重定向和管道符可以联合使用,这样可以组合出更加复杂的命令, 例如:
ls | grep '\.sh' | sort > shlist
上面这个命令将当前目录的内容列出来,将其作为grep命令的输入内容,grep将过滤掉没有以".sh"结尾的内容,然后将内容输出给sort命令作为输入参数,sort将输入内容按照字符的顺序排序以后,将最终的输入内容写入shlist文件。在Unix和Linux操作系统中,这个样的组合命令非常的常见。
重定向到多个输出
命令tee可以将一个命令的输出重定向到几个目标:
ls -lrt | tee xyz
上面这个例子将ls的输出重新定向到标准输出和文件xyz。
参见
- Here-document, a way of specifying text for input in command line shells
外部链接
- Redirection Definition (页面存档备份,存于互联网档案馆) by The Linux Information Project (LINFO)
- I/O Redirection (页面存档备份,存于互联网档案馆) in The Linux Documentation Project (页面存档备份,存于互联网档案馆)
- Redirection in Windows (页面存档备份,存于互联网档案馆)
- Creating a Child Process with Redirected Input and Output (页面存档备份,存于互联网档案馆) in Windows