ls -l | wc -l 重定向到新文件时输出不同

ls -l | wc -l 重定向到新文件时输出不同

“ls -l | wc -l”输出“1+no. file/directories”(第一行多一个)。

但是,当我运行命令 ls -l | wc -l > temp 时(当输出重定向到新文件 temp 时)。临时文件中存储的值比未重定向时输出的值多 1。我猜这是因为创建了新的“临时”文件,但临时文件应该在运行 ls -l 命令后创建,因此输出应该与未重定向时的输出相同。

请有人帮忙

答案1

这是完全正常的行为。

实际情况是,shell(sh、bash、csh、ksh 等)首先读取整个命令行。
然后构造进程、管道和重定向文件从右到左的顺序然后才运行实际的命令。

因此,重定向文件 (temp) 是在运行 ls 命令之前创建的。
必须这样做,因为在实际启动 wc 之前,与“temp”关联的文件句柄需要可用,以用作 wc 输出的目标。
反过来,在 ls 的输出可以附加到将作为 wc 输入的文件句柄之前,需要设置 wc 命令。

尽管乍一看这似乎有点不合逻辑,但当你理解 shell 构建命令序列的方式时,这就完全说得通了。

答案2

shell 实际上temp在开始运行命令之前创建了文件,因此您始终会看到文件temp被计数。如果您不想将其计数,请将临时文件放在其他地方,例如/tmp。或者从您获得的计数中减一。

相关内容