*unix 命令里的管道和重定向到底应该怎么用

*unix 命令里的管道和重定向到底应该怎么用

Chris Yue No Comment
Posts

注:本篇不从技术细节角度来讨论管道和重定向有什么不一样,仅从使用的角度来说应怎么理解管道和重定向操作。

我虽然用了很久的 *unix 命令,但对于管道和重定向长期处于一种稀里糊涂但还能用的状态。为了消除这种不通透的感觉,今天花了一点时间查资料,在这里把结论记录一下。

要说清楚管道 | 和重定向 < > 操作,就必须得先知道标准输入和输出。标准输出应该大家都熟悉,比如运行 echo hi 这个命令,命令行输出的 hi 就是标准输出;而标准输入,下面也用一个最简例子来说明。

cat 命令大家也都熟,接收文件路径作为参数,将文件内容输出。实际上 cat 命令也可以不传参,直接运行后,程序会处于等待用户输入的状态。当用户输入完内容后回车,或者 Ctrl+D,程序会立马回显刚刚的输入。在回车之前输入的内容,就是标准输入。

接下来再说管道。简单说,管道就是将一个程序的输出,变成另一个程序的输入。

依然通过一个最简代码说明:echo hi | cat ,用 echo 的结果当成 cat 的输入,相当于单独执行 cat 后手动输入了 hi 并回车 + Ctrl+D(表示输入结束)。

而重定向则跟文件有关。比较好理解的一个最简例子:echo hi > foo.txt,大家应该都知道是将 echo 输出内容送到文件 foo.txt 里。

我们再来看看 <,既然跟 > 方向相反,也应该能猜到跟输入有关。依然通过例子来对比,一个是 cat foo.txt,一个是 cat < foo.txt,这两个命令如果大家实际运行一下,会发现结果完全一样,但实际上运行的过程是不一样的。第一个命令是 cat 直接输出了文件内容,而第二个命令则是通过 < 先将文件变成了标准输入,再通过 cat 将标准输入输出。

目前看来都比较好懂,不过像我这种眼神不好的,经常被一些组合用法绕晕。一个简单的例子:

cat > bar.txt < foo.txt

我就不说我之前是怎么错误理解这类命令的了,总之在我清晰理解重定向的用法之后我才发现,原来重定向操作只是跟使用它的命令(上面的例子就是 cat )有关系,而跟在它之前的是什么毛关系都没有。比如上面的命令,输入和输出重定向掉个个儿,也是一样的效果:

cat < foo.txt > bar.txt

< foo.txt> bar.txt 其实没有一点儿关系,它们都只跟 cat 合作。

需要多说一句的是,*unix 号称万物皆文件,所以不能狭隘得理解 *unix 里的文件。常见比如 xxx > /dev/null

*unix 命令里的管道和重定向到底应该怎么用 by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

写作累,服务器还越来越贵
求分担,祝愿好人一生平安
天使打赏人

发表评论

6 + 4 =