shell 为什么“ls>out|cat〈out”只在我第一次在Bash中运行它时输出?

khbbv19g  于 2023-02-05  发布在  Shell
关注(0)|答案(1)|浏览(121)

我正在编写一个类似于Bash的shell。我很难理解这种交互是如何工作的。
此命令

ls > out | cat < out

第一次运行时只输出ls,然后什么都不输出。在zsh中它每次都输出,但在bash中不输出。

eh57zj3b

eh57zj3b1#

您试图给解析器提供冲突的指令。
这就像告诉某人“在你的右边向左转”。
<>|都指示解释器根据规则重定向I/O。
请看这个bash示例:

$: echo two>two # creates a file named two with the word two in it
$: echo one | cat < two <<< "three" << END
four
END
four

$: echo one | cat < two <<< three
three

$: echo one | cat < two
two

$: echo one | cat
one

要知道,在命令之间放置管道字符(|)将第一个命令的输出链接到第二个命令的输入,因此 * 还 * 为每个命令提供与之冲突的输入/输出重定向是毫无意义的。

ls | cat             # works - output of ls is input for cat
ls > out; cat < out  # works - ls outputs to out, then cat reads out 
ls > >(cat)          # works 
cat < <(ls)          # works

但是ls >out | catls的输出发送到out,然后将该操作的输出(没有输出,因为它已经被捕获)附加到catcat退出时没有输入或输出。
如果您希望将输出既放到文件又放到控制台,那么可以使用ls > out; cat < out使它们成为单独的操作,或者尝试

ls | tee out

其显式地将流分割为文件和标准输出。

相关问题