使用后台运算符 (&) 在条件 bash 命令中实现函数时出现问题

问题描述 投票:0回答:1

我正在编写一个 Bash 脚本,我需要在检查指定的 Git 远程是否存在时显示旋转动画功能。检查Git远程的脚本片段如下:

read remote_to_pull_from
if ! git remote show $remote_to_pull_from &>/dev/null; then
    echo "Remote '$remote_to_pull_from' does not exist, exiting..."
    return 1
fi

此代码片段工作正常并检查遥控器是否存在。现在,我想添加一个微调器功能,以在 git Remote show 命令运行时显示动画。旋转器功能,归功于this帖子,如下:

spinner() {
    local PROC="$1"
    local str="${2:-'Running...'}"
    local delay="0.1"
    tput civis  # hide cursor
    printf "\033[1;34m"
    while [ -d /proc/$PROC ]; do
        printf '\033[s\033[u[ / ] %s\033[u' "$str"; sleep "$delay"
        printf '\033[s\033[u[ — ] %s\033[u' "$str"; sleep "$delay"
        printf '\033[s\033[u[ \ ] %s\033[u' "$str"; sleep "$delay"
        printf '\033[s\033[u[ | ] %s\033[u' "$str"; sleep "$delay"
    done
    tput cnorm  # restore cursor
    return 0
}

我尝试使用 Stack Overflow 帖子中提到的方法将微调器与条件检查集成,其中微调器动画使用后台运算符 (&) 在后台运行。这是我在检查我的状况时用来让它运行的代码:

read remote_to_pull_from
if ! git remote show $remote_to_pull_from &>/dev/null & spinner $!; then
    echo "Remote '$remote_to_pull_from' does not exist, exiting..."
    return 1
fi

旋转器旋转,但条件失败,脚本回显错误消息,而没有旋转器,条件正常工作。

我希望在执行 git remote show 命令时运行 spinner 函数,如果远程不存在,脚本应该回显错误消息并退出。如何在条件检查中正确使用此微调函数,我认为我在这里缺少一个逻辑步骤,并且在将其与该函数混合时破坏了条件?我该如何处理这个问题?另外,能解释一下$!的用法吗?在这种情况下? 谢谢大家。

bash function if-statement unix conditional-statements
1个回答
0
投票

不是完全重写,但你正在寻找这样的东西:

spinner() {
    while kill -0 $! >/dev/null 2>&1; do
        for pipe in '/' '-' '\' '|'; do
            printf '%s Running...\r' "$pipe"
            sleep .1
        done
    done
    printf '\n'
    wait $!
}

read -p 'Enter remote name: ' remote
if git remote show "$remote" >/dev/null 2>&1 & ! spinner; then
    printf 'Remote %q does not exist.\n' "$remote" >&2
    exit 1
fi
© www.soinside.com 2019 - 2024. All rights reserved.