我有这个超时代码块:
#!/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中然后执行的唯一方法 - 在我的情况下非常有效。
我的问题:
我怎样才能正确使用nohup
and&
与上面的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
在执行代码时展开,$
需要引用。