shell 变量在 sudo 执行的命令中起作用吗?
我试图以脚本中的另一个用户身份运行后台进程,然后将其终止。但是,我无法使用“$!”捕获后台进程 ID,这意味着我以后无法终止该进程。
下面是我整理的一个用来说明的简单示例:
#!/bin/bash
userOfThisScript=`id -u -n $SUDO_USER`
sudo -u $userOfThisScript /bin/bash << EOBLOCK
vi &
echo "BG Task ID inside block: <$!>" # <-- $! is empty string
kill $!
EOBLOCK
运行后台进程工作正常。检查执行的进程(例如使用“ps”),我可以确认该进程确实由授予 sudo 的用户拥有。但是,$! 变量只是一个空字符串(据我所知)。
如果我删除 sudo/bash 块并仅执行该进程并将其终止,那么一切都将按预期工作,并且正确的进程 ID 存储在 $! 中。
有人知道为什么 $! 在这个 sudo/bash 命令执行中不起作用吗?
(我使用的是 Linux/Ubuntu 发行版,14.04 和 16.04。)
答案1
未加引号的分隔符的 here 文档会进行变量扩展。因此,$!
将在外部脚本的上下文中进行解释,而不是在运行 here 文档中的命令的 shell 中进行解释。
引用<< 'EOBLOCK'
,或者在此处的文档中反斜杠美元符号:kill \$!
。