语境
我在用这边走如果不以 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 之前退出,就会发生不好的事情(在某些操作系统上可能会发生,希望现在不会太多)。