linux - 终端中命令输出的说明

标签 linux shell terminal pipe

我在 linux 终端上尝试某些命令,但我无法理解以下命令的输出:

wc < sfddfs |& wc
sfddfs: No such file or directory.
0 0 0

这里的 sfddfs 是一个不存在的文件。为什么它给出输出 0 0 0.

当sfddfs的文件内容传递给wc时,发现文件不存在,会给出错误输出(写在StdError上),通过管道传递给下一个wc。那么我们不应该用 StdError 的输出来计算吗?即1 6 34

最佳答案

与:

wc < nosuchfile

这不是 wc 提示丢失的文件,而是您正在运行的 shell。 shell 正在尝试打开 nosuchfile 以便它可以将它连接到标准输入文件句柄,而 wc 甚至不知道发生了什么 - 据就其而言,来自终端的标准输入或从文件重定向的标准输入应该没有区别。

这种连接尝试发生在 wc 程序实际加载到进程空间之前很久,因此 shell 会报告错误。而且,事实上,wc 在那种情况下甚至没有运行,您可以通过以下方式确认:

( echo X ) < nosuchfile

没有 X 在这里输出,因为永远不会执行回显它的子 shell。一个更明显的例子是:

sleep 60 < nosuchfile

显然不会休眠 60 秒。

并且,因为在这种情况下 wc 没有运行,所以完整命令序列中的 second wc 接收到一个空流,提示它给你 0 0 0 作为输出。

关于linux - 终端中命令输出的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26353317/

相关文章:

linux - 提取没有同名目录的文件

java - 在 Linux 上用 java 获取 .exe 的文件版本

ios - 从终端构建项目抛出配置文件错误

linux - 在 Linux 上更改站点代码 SCCM 代理

c++ - 在Linux中,如何获取在valgrind下运行的程序的回溯

linux - shell 脚本中的嵌套 Case 语句 |获取语​​法错误

python - 如何从 python 中的 osx 钥匙串(keychain)获取代理密码?

linux - 使用 awk 将日期加一个月

linux - 我的 $PATH 和 bash 命令遇到问题

linux - 列出以两个点开头的文件并批量更改文件名