
次のタイムアウトコードブロックがあります。
#!/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
このフラグを指定する必要があります。
この例のコードが機能していることを確認するには、新しい疑似端末を開き、次のように入力します(注:最初の付近の引用符は必須であり、EOF0
heredoc自体の内部の拡張を防ぎます)。$1
nohup bash -s -- $$ <<'EOF0' &
#!/bin/bash
WB=$1
sleep 2h;
commands...
kill $WB
EOF0
しかし、EOF0自体には特別な意味がないということを申し上げたいと思います。必要な文字列を区切り文字として使用できます(たとえば、'EOF'
または'HEREDOC_DELIMITER'
)。重要なのは、記号の近くに一重引用符があることです<<
。これにより、heredocの内部での拡張が防止されるため、スクリプトパラメータ($1
公開されたコードで利用可能なものと同じ)の他のheredocをネストしてください。
答え2
コードを使用してください:
nohup bash <<EOF &
WB=$1
sleep 2h;
commands...
kill \$WB
EOF
コードを読む$1
と拡張されることに注意してください。$WB
コードの実行時に拡張するには$
引用符が必要です。