等待 sudo 提示时回显

等待 sudo 提示时回显

语境

我在用这边走如果不以 root 身份运行,则提升脚本中的权限。

我的 Bash 脚本检查它需要使用的某个文件是否存在:

if [ $EUID != 0 ]; then
    if [ -f "/foo/bar" ]
    then
        AGE=$(expr `date +%s` - `stat -c %Y "/foo/bar"`)
        echo "/foo/bar is here, ${AGE}s old"
    else
        echo "/foo/bar not there (yet?)"
    fi

    sudo "$0" "$@"
    exit $?
fi

# the rest of the script, needs /foo/bar

因此,如果非 root 运行此命令,并且存在该文件,则响应如下所示/foo/bar is here, 27s old。否则,响应为/foo/bar is not there (yet?)。然后,sudo提示运行。

现在的问题是:在第二种情况下,当/foo/bar还没有准备好时,有没有办法一旦/foo/bar出现就通知用户?用户输入密码后会看到“哦,文件就在那里”或“最好等一下,然后再按回车键”。

这有两个部分,检测文件系统中已出现文件(不问这个),并且在 sudo 提示符出现时回显一些内容

问题

我对第二部分感兴趣。是否可以在 sudo 提示符上方或下方“异步”向输出写入一些内容?

答案1

回答问题的第二部分,如何在等待提示时编写消息sudo

trap '2>/dev/null' CHLD
(sleep 5; echo; echo "New spam has just arrived!") &
MSGPID=$!
sudo -v
wait $MSGPID
trap - CHLD

sleep 5在子 shell 中模拟消息异步到达。第一个echo只是确保消息不会出现在Password:提示旁边。当写入stderr而不是写入时它也有效stdout

第一个trap是删除有关后台作业状态的消息。 waitpid第二个trap抵消了第一个的影响trap

如果子 shell 中的命令在有机会返回有意义的 PID 之前退出,就会发生不好的事情(在某些操作系统上可能会发生,希望现在不会太多)。

相关内容