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
我有一些这样的代码:
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