我知道如何检查使用$以前执行的命令的状态?我们可以使用exit命令作出这样的状态。 但在bash的循环总是返回状态0,是有什么办法可以破解一些状态的循环。
#!/bin/bash
while true
do
if [ -f "/test" ] ; then
break ### Here I would like to exit with some status
fi
done
echo $? ## Here I want to check the status.
循环的状态是执行的最后一个命令的状态。 您可以使用break跳出循环,但如果突破成功,则循环的状态将是0
。 但是,你可以使用一个子shell和退出,而不是破坏。 换一种说法:
for i in foo bar; do echo $i; false; break; done; echo $? # The loop succeeds
( for i in foo bar; do echo $i; false; exit; done ); echo $? # The loop fails
你也可以把循环的功能,从它返回一个值。
像这样的事情?
while true; do
case $RANDOM in *0) exit 27 ;; esac
done
还是这样吗?
rc=0
for file in *; do
grep fnord "$file" || rc=$?
done
exit $rc
真正的问题是决定循环的退出代码是否应该是成功还是失败,如果一个迭代失败。 有场景,其中一个更有意义比其他,和其他地方不是在所有明确。
bash的手册说:
while list-1; do list-2; done
until list-1; do list-2; done
[..]The exit status of the while and until commands is the exit status
of the last command executed in list-2, or zero if none was executed.[..]
即在循环内执行的最后一个命令是break
。 而出口值break
为0(见: help break
)。
这就是为什么你的程序保持与0退出。
内建对于bash确实允许你完成你在做什么突破,只是负值和$返回的状态打破? 将1:
while true
do
if [ -f "./test" ] ; then
break -1
fi
done
echo $? ## You'll get 1 here..
请注意,这是在帮助打破内置记载:
help break
打破:打破[n]的退出,同时,或直到环路。
退出FOR,WHILE或直至循环。 如果指定了N,打破封闭ñ循环。
退出状态:退出状态是0,除非N为不大于或等于1。
你可以打破循环的n个或以非回零破发负值,即1
我同意@hagello作为一个选项做了睡眠和改变环路:
#!/bin/bash
timeout=120
waittime=0
sleepinterval=3
until [[ -f "./test" || ($waittime -eq $timeout) ]]
do
$(sleep $sleepinterval)
waittime=$((waittime + sleepinterval))
echo "waittime is $waittime"
done
if [ $waittime -lt $sleepinterval ]; then
echo "file already exists"
elif [ $waittime -lt $timeout ]; then
echo "waited between $((waittime-3)) and $waittime seconds for this to finish..."
else
echo "operation timed out..."
fi
我想你应该问的是: 我怎样才能等到一个文件或目录( /test
)获取由另一个进程创建?
你现在正在做的最多是轮询满功率。 你的循环将分配高达一个核的处理能力的100%。 关键词是“投票”,这是由计算机科学家的标准不道德 。
有两种补救措施:
- 插入您的循环睡眠声明; 优点:很简单; 缺点:延迟将是CPU负载和响应之间的任意的折衷。 (“任意”是不道德,太)。
- 使用通知机制类似
inotify
(参见: man inotify
); 优点:无CPU负载,极大响应,没有延迟,在你的代码中没有任意常数; 缺点: inotify
是一个内核API -你需要一些代码来访问它: inotify-tools
或一些C /的Perl / Python代码。 看看inotify的和bash !