我的理解是,像 shell 中的管道将's stdina | b
重定向到's stdout。然而,我尝试过,行为很奇怪。显示的内容连接的输出。b
a
ls | less < somefile
less
ls
somefile
有人可以解释这个现象吗?
答案1
你的理解不太正确。在通过管道连接的a | b
进程的标准输出输出中a
标准输入的过程b
。您的代码的问题在于,通过从somefile
process 进行额外的重定向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 的输出无关。