“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
。或者从您获得的计数中减一。