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

时间:2017-02-27 16:36:18

标签: bash shell wc

我有一些像这样的代码:

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的混合。是否有解决这个问题的方法?任何建议都非常感谢。

2 个答案:

答案 0 :(得分:1)

您的代码的第二个实例同时运行。检查正在运行的进程并终止前一个进程。

命令

player = MediaPlayer.create(this, R.raw.name);
    player.start();

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

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

答案 1 :(得分:1)

假设BOC建议第二个进程干扰是正确的,那么您通过使用不必要的文件(提供允许竞争条件发生的共享资源)来解决问题。

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

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

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

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