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 中然後執行的唯一方法 - 在我的情況下非常有效。
我的問題:
我怎樣才能正確使用
nohup
和&
使用上面的 hereodc?請注意,上面的heredoc是一個特殊的,它是一個外部heredoc(EOF0),允許在其中包含1個或多個heredoc(EOF1,EOF2 …)。
據我了解,您想複製腳本的全部內容,並將其粘貼為heredoc 以執行它。您可以這樣做,但有一個問題:如何為將出現在 heredoc 中的位置參數 $1 賦值?這裡的技巧是將該參數傳遞給 bash,方法是將它放在一個
--
符號之後(它將傳遞給 bash 本身的參數與傳遞給腳本的參數分開)。Bash 當然必須從標準輸入讀取命令,所以-s
必須指定標誌。要使用範例中的程式碼查看此內容,請打開一個新的偽終端並輸入以下內容(注意:第一個附近的引號
EOF0
是強制性的,它們會阻止$1
heredoc 本身內部的擴展):nohup bash -s -- $$ <<'EOF0' & #!/bin/bash WB=$1 sleep 2h; commands... kill $WB EOF0
但是我必須告訴你,EOF0 本身並沒有什麼特別的意義。您可以使用任何您想要的字元串作為heredoc 分隔符(例如,它可能是
'EOF'
或'HEREDOC_DELIMITER'
):重要的是它周圍有單引號,靠近<<
符號;這可以防止 heredoc 內部的任何擴展,這使您既可以使用腳本參數(就像您可以$1
在您發布的程式碼中使用一樣)也可以嵌套其他 heredocs。