wc -l 有时会输出错误的数字

wc -l Sometimes Outputs Wrong Number

我有一些这样的代码:

while true
do
    who | cut -d' ' -f1 | sort | grep -v "erik" > "/home/erik/logintester/users.txt"

    lines=$(< "/home/erik/logintester/users.txt" wc -l)

    echo "$lines"

done

它应该在有其他人登录时回显“1”,但我得到的却是 1 和 0 的混合。这个问题有解决办法吗?非常感谢任何建议。

您的代码的第二个实例同时是 运行。检查 运行 个进程并杀死前一个。

命令

who | cut -d' ' -f1 | sort | grep -v "erik" > "/home/erik/logintester/users.txt"

不是原子的。它首先创建一个空文件users.txt,然后为管道的每个命令创建所有进程,然后将这些进程写入文件。这给出了文件为空的时间流逝。当你有两个进程运行相同的代码时,有可能一个进程显示另一个进程创建的空文件的内容。

像@chepner 建议的那样避免临时文件总是一个好主意。

假设 BOC 关于第二个进程干扰的建议是正确的,那么您使用不必要的文件(它提供允许出现竞争条件的共享资源)是导致问题的原因。

您只需要一条管道。 (捕获管道的输出以调用 echo 也是不必要的。)

while true; do
    who | cut -d' ' -f1 | sort | grep -v "erik" | wc -l
done

您可以通过调用 awk 来进一步简化它(sort 似乎没有任何作用;无论输出顺序如何,计数都是相同的):

while true; do
    who | awk ' != "erik" {count+=1} END {print count}'
done