我有一些像这样的代码:
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的混合。是否有解决这个问题的方法?任何建议都非常感谢。
答案 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