syed@Emad-World:~$ date | cut --delimiter=" " --fields=1 > date.txt | cat date.txt
syed@Emad-World:~$
答案1
Shell 的管道 ( |
) 结构用于将一个进程的标准输出连接到另一个进程的标准输入。
在您的例子中,您将cut
命令的标准输出重定向到文件 ( > date.txt
),而根本不读取标准输入(因为您将文件名参数 传递date.txt
给cat
命令)。在这种情况下,适当的 shell 连词是:
&&
其中cat date.txt
将有条件地执行,取决于管道中先前命令的成功退出状态
或者
;
在这种情况下cat date.txt
将无条件执行
在这种情况下,可能更合适(例如,如果我们无法写入,&&
我们就不会尝试读取)。所以date.txt
date | cut --delimiter=" " --fields=1 > date.txt && cat date.txt
除非您只是在使用管道,否则您可以cut
通过date
直接输出缩写的星期名称来避免这种情况:
date +%a > date.txt && cat date.txt
您可能想知道为什么date | cut --delimiter=" " --fields=1 > date.txt | cat date.txt
不管用——因为它在语法上是正确的。原因是您不能依赖管道的 LHS 和 RHS 的执行顺序——因此cat date.txt
很可能在 date 命令的输出写入之前执行。
答案2
当您不传输任何内容时,这是预期的行为。
$ date | cut --delimiter=" " --fields=1 > date.txt | cat date.txt
$
Date 返回一个字符串,您可以将其拆分,然后将一个单词写入新文件。创建新文件不会在 STDOUT 上输出,因此不会有任何内容通过管道传输到 cat。