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"。