带重定向的 shell 中的管道

带重定向的 shell 中的管道

我的理解是,像 shell 中的管道将's stdina | b重定向到's stdout。然而,我尝试过,行为很奇怪。显示的内容连接的输出。bals | less < somefilelesslssomefile

有人可以解释这个现象吗?

答案1

你的理解不太正确。在通过管道连接的a | b进程的标准输出输出中a标准输入的过程b。您的代码的问题在于,通过从somefileprocess 进行额外的重定向b,您将同时使用两种不同的方法来连接到 process 的 stdin b。不要那样做!问题是;你首先想(用这样的结构)实现什么目标?

答案2

你没有说你用的是什么外壳。从你描述的行为来看,这是有可能的zsh。如果您查看其手册页,您会注意到如何处理重定向。

请注意,管道是隐式重定向;因此

  cat bar | sort <foo

相当于cat bar foo | sort(注意输入的顺序)。

否则,常规行为例如其中之一bash是每个重定向都会替换该文件描述符的前一个重定向。

zsh手册页继续:

如果未设置 MULTIOS 选项,则每个重定向都会替换该文件描述符的先前重定向。然而,所有重定向到的文件实际上都被打开,所以

  echo foo > bar > baz

当 MULTIOS 未设置时,将截断 bar,并将“foo”写入 baz。

答案3

因为您从某个文件中获取的输入较少。

它的工作原理是这样的

1 -> 执行 ls ,因为您使用了管道,它将通过管道将 stdout 传输到下一个命令的 stdin :这就是您所说的

2 -> 它将查看第二个命令.. 它小于 < somefile

一看到'<' 重定向它将再次将标准输入更改为文件...因此您之前的更改是因为 '|'正在迷路。

好吧,你可以这样说: less 从文件中获取输入,它与 ls 的输出无关。

相关内容