如何在heredocument中执行nohup?

如何在heredocument中执行nohup?

我有这个超时代码块:

#!/bin/bash

WB=$1
sleep 2h;
commands...
kill $WB

nohup要使用和运行脚本背景,我可以将其粘贴到文件中,然后执行:

nohup /opt/myscript.sh $$ &

我的目标是实现:

我不想将其粘贴到文件中并执行,而是想直接从heredoc执行它:

/dev/fd/10 10<< 'EOF0'
#!/bin/bash

WB=$1
sleep 2h;
commands...
kill $WB
EOF0

我使用heredoc,因为heredocs是将整个代码块直接粘贴到Bash中然后执行的唯一方法 - 在我的情况下非常有效。

我的问题:

我怎样才能正确使用nohupand&与上面的hereodc?

请注意,上面的heredoc是一个特殊的heredoc,它是一个外部heredoc(EOF0),允许其中包含1个或多个heredoc(EOF1,EOF2...)。

答案1

据我了解,您想要复制脚本的全部内容,并将其粘贴为定界文档来执行它。您可以这样做,但有一个问题:如何为将出现在 Heredoc 中的位置参数 $1 分配一个值?这里的技巧是将该参数传递给 bash,方法是将其放在一个--符号后面(它将传递给 bash 本身的参数与传递给脚本的参数分开)。 Bash 当然必须从标准输入读取命令,因此-s必须指定该标志。

要查看此示例中的代码的工作情况,请打开一个新的伪终端并输入以下内容(注意:第一个附近的引号是强制性的,它们会阻止heredoc本身内部EOF0的扩展):$1

nohup bash -s -- $$ <<'EOF0' &
#!/bin/bash

WB=$1
sleep 2h;
commands...
kill $WB
EOF0

然而我必须告诉你,EOF0 本身没有任何特殊含义。您可以使用任何您想要的字符串作为定界符(例如,它可能是'EOF'or 'HEREDOC_DELIMITER'):重要的是它周围有单引号,靠近<<符号;这可以防止heredoc内部的任何扩展,这使您能够使用脚本参数(就像您可以$1在发布的代码中使用一样)并嵌套其他heredoc。

答案2

使用您的代码:

nohup bash <<EOF &
WB=$1
sleep 2h;
commands...
kill \$WB
EOF

注意阅读$1代码时会展开;要$WB在执行代码时展开,$需要引用。

相关内容