最后一个后台进程 ID ($!) 在 sudo bash 命令中不起作用

最后一个后台进程 ID ($!) 在 sudo bash 命令中不起作用

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 \$!

相关内容