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

heredocs はコードブロック全体を Bash に直接貼り付けてから実行する唯一の方法なので、heredocs を使用します。私の場合は素晴らしい作品です。

私の質問:

上記のhereodcをどのように正しくnohup使用できますか?&

上記のheredocは特別なheredocであり、外部heredoc(EOF0)なので、1つ以上のheredoc(EOF1、EOF2...)を含めることができます。

ベストアンサー1

私が理解したところによると、スクリプトの全内容をコピーして区切られた文書に貼り付けて実行したいようです。これを行うことができますが、問題があります。 Heredocに表示される位置パラメータ$ 1に値をどのように割り当てますか?ここでの秘密は、対応するパラメータを--シンボルの後に置き、bashに渡すことです(bash自体に渡されたパラメータとスクリプトに渡されたパラメータを分離します)。 Bashはもちろん、標準入力からコマンドを読み取る必要があるため、-sこのフラグを指定する必要があります。

この例のコードが機能していることを確認するには、新しい疑似端末を開き、次のように入力します(注:最初の付近の引用符は必須であり、EOF0heredoc自体の内部の拡張を防ぎます)。$1

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

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

しかし、EOF0自体には特別な意味がないということを申し上げたいと思います。必要な文字列を区切り文字として使用できます(たとえば、'EOF'または'HEREDOC_DELIMITER')。重要なのは、記号の近くに一重引用符があることです<<。これにより、heredocの内部での拡張が防止されるため、スクリプトパラメータ($1公開されたコードで利用可能なものと同じ)の他のheredocをネストしてください。

おすすめ記事