如何强制 bash 脚本等待用户回答?

cov*_*wer 3 linux script bash

已经有类似的问题,但我发布这个是因为没有一个答案有效。我正在编写一个 bash 脚本来自动在我的 Arch 系统上安装 pacman 和 AUR 包。这个想法是首先逐行读取包名称的文件(myfile),然后逐字读取并为每个单词执行安装。这适用于吃豆子,但不适用于 AUR Helper (aurman)。aurman 的部分如下所示:

while read line; do
if [[ "$line" =~ \$[[:space:]]aurman[[:space:]]-S[[:space:]][[:alnum:]]* ]]
then
    aurline=$(echo "$line" | awk '{ $1=""; $2=""; $3=""; print}' | sed 's/^ *//')
    for aurpkg in $aurline
    do
       sudo -u "${my_user}" bash << EOF
aurman -S --noconfirm --needed --noedit "$aurpkg"
wait
EOF
    done
fi
done < "$myfile"
Run Code Online (Sandbox Code Playgroud)

使用选项--noconfirm --needed --noedit aurman 不会提示我输入是/否,但对于某些软件包,它会提示我输入一个数字。所以问题是在这种情况下脚本不等待,包没有被安装并且 aurman 产生错误“EOFError: EOF when reading a line”。我试图像这样暂停脚本:

aurman ...
wait
Run Code Online (Sandbox Code Playgroud)

或者像这样:

aurman ... &
wait
Run Code Online (Sandbox Code Playgroud)

但这些都不起作用。

那么当 aurman 提示我输入数字时,我该如何暂停我的脚本呢?在这种情况下,一般的方法是什么?当我运行脚本时,我怎么能从一开始就为特定的包提供答案(例如,包 x 为 1)?

Gor*_*son 5

基本问题是 stdin(aurman试图从中读取)不是来自用户,它首先从 重定向$myfile,然后从包含sudo要运行的 shell 命令的 here-document重定向。一种选择是通过不同的文件描述符传递这些文件,例如#3(通常未使用)。我认为您还可以通过消除在其下运行的 shell 来简化它sudo- 因为您aurman在前台运行,所以不需要wait它,所以您不需要 shell(因此不需要 here-doc )。

while read line <&3; do
    if [[ "$line" =~ \$[[:space:]]aurman[[:space:]]-S[[:space:]][[:alnum:]]* ]]
    then
        aurline=$(echo "$line" | awk '{ $1=""; $2=""; $3=""; print}' | sed 's/^ *//')
        for aurpkg in $aurline
        do
            sudo -u "${my_user}" aurman -S --noconfirm --needed --noedit "$aurpkg"
        done
    fi
done 3< "$myfile"
Run Code Online (Sandbox Code Playgroud)

如果这不起作用并且您实际上需要在 下运行 shell sudo,您也可以通过 FD #3 重定向它,并将bash其作为脚本阅读,如下所示:

            sudo -u "${my_user}" bash /dev/fd/3 3<< EOF
aurman -S --noconfirm --needed --noedit "$aurpkg"
wait
EOF
Run Code Online (Sandbox Code Playgroud)