Bash 条件命令
Bash conditional commands
我有一串命令想运行连续执行,如果前面的命令已经成功的话。这是一个例子:
echo "hello" && sleep 5 && cd /tmp && rm -r * && echo "googbye"
如果任何部分出现故障,我需要知道是哪部分出现故障。此外,我正在尝试在命令 运行ning 时实现微调器。有办法吗?
在检测哪个位失败方面,您可以使用:
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 "" ]] ; 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.$$
在 payload 函数中,只需将每个步骤替换为您实际想要执行的操作(例如关闭 systemd
作业或删除一些文件)。
目前的代码将无法执行第 2 步 (false
),但是对于您自己的代码,这将是 运行ning actual 命令和评估他们的 return 价值。
我还使用了哨兵文件来终止微调器功能,这样它就不会关闭 "violently"。
我有一串命令想运行连续执行,如果前面的命令已经成功的话。这是一个例子:
echo "hello" && sleep 5 && cd /tmp && rm -r * && echo "googbye"
如果任何部分出现故障,我需要知道是哪部分出现故障。此外,我正在尝试在命令 运行ning 时实现微调器。有办法吗?
在检测哪个位失败方面,您可以使用:
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 "" ]] ; 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.$$
在 payload 函数中,只需将每个步骤替换为您实际想要执行的操作(例如关闭 systemd
作业或删除一些文件)。
目前的代码将无法执行第 2 步 (false
),但是对于您自己的代码,这将是 运行ning actual 命令和评估他们的 return 价值。
我还使用了哨兵文件来终止微调器功能,这样它就不会关闭 "violently"。