如果上一个命令成功,我有一串我想要连续运行的命令。这是一个例子:
echo "hello" && sleep 5 && cd /tmp && rm -r * && echo "googbye"
如果任何部分失败,我需要知道哪部分失败了。此外,我正在尝试在命令运行时实现微调器。有没有办法做到这一点?
答案 0 :(得分:0)
在检测哪个位失败方面,您可以使用:
bad=0
[[ $bad -eq 0 ]] && { echo hello || bad=1; }
[[ $bad -eq 0 ]] && { sleep 5 || bad=2; }
[[ $bad -eq 0 ]] && { cd /tmp || bad=3; }
[[ $bad -eq 0 ]] && { rm -r * || bad=4; }
[[ $bad -eq 0 ]] && { echo goodbye || bad=5; }
然后将根据哪个位失败(如果有)来设置变量bad
。
或者,如果它太冗长,你仍然可以在一行中做,虽然时间更长:
bad=1 && echo hello && bad=2 && sleep 5 && bad=3 && cd /tmp && bad=4 && echo goodbye && bad=0
就微调器而言,如果你在你正在做的工作中确实有输出,那么这可能效果不是很好,但是你可以用一个简单的后台函数来完成:
spinner() {
while : ; do
echo -ne '\b|' ; sleep 1
echo -ne '\b/' ; sleep 1
echo -ne '\b-' ; sleep 1
echo -ne '\b\\' ; sleep 1
done
}
echo -n 'Starting: .'
spinner & pid=$!
sleep 13 ; kill $pid
echo
echo Done.
关于根据您的问题和评论将所有内容放在一起,我可能有两个函数,第一个在后台运行微调器,第二个用于执行有效负载,包括捕获其输出,因此它不会影响微调器。
为此,请查看以下演示代码:
spinner() {
echo -n 'Starting: .'
chars='\-/|'
while [[ -f "$1" ]] ; do
echo -ne "\b${chars:3}" ; sleep 1
chars="${chars:3}${chars:0:3}"
done
echo -e ' .. done.'
}
payload() {
echo Running task 1
sleep 3
true || return 1
echo Running task 2
sleep 3
false || return 2
echo Running task 3
sleep 3
true || return 3
return 0
}
touch /tmp/sentinel.$$
spinner /tmp/sentinel.$$ & pid=$!
payload >/tmp/out.$$ 2>&1 ; rc=$?
rm /tmp/sentinel.$$ ; wait
echo "Return code was $rc, output was:"
cat /tmp/out.$$
rm /tmp/out.$$
在有效负载功能中,只需将每个步骤替换为您希望实际执行的操作(例如关闭systemd
作业或删除某些文件)。
现有代码将失败第2步(false
)但是,对于您自己的代码,这将运行实际命令并评估其返回值。
我还使用了一个哨兵文件来终止微调器功能,这样它就不会被关闭"暴力"。