Nohup

如何在 heredocument 中執行 nohup?

  • December 30, 2016

我有這個超時程式碼塊:

#!/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是強制性的,它們會阻止$1heredoc 本身內部的擴展):

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

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

但是我必須告訴你,EOF0 本身並沒有什麼特別的意義。您可以使用任何您想要的字元串作為heredoc 分隔符(例如,它可能是'EOF''HEREDOC_DELIMITER'):重要的是它周圍有單引號,靠近<<符號;這可以防止 heredoc 內部的任何擴展,這使您既可以使用腳本參數(就像您可以$1在您發布的程式碼中使用一樣)也可以嵌套其他 heredocs。

引用自:https://unix.stackexchange.com/questions/333664