説明する
コマンドを含む同じループはchroot
端末で実行できますが、シェルスクリプトでは実行できません。
生殖
デフォルト(またはユーザーの)rootfsの作成
/mnt/myrootfs
次の内容でファイルを作成し
/mnt/myrootfs/tmp/hello.sh
て実行可能にします。#!/bin/bash echo "i am exiting." exit
次のスクリプト(
./chroot-poll.sh
)を生成します。#!/bin/bash while sleep 1; do echo "chrooting into the target..." sleep 1 sudo chroot /mnt/myrootfs /bin/bash --rcfile /tmp/hello.sh done
結果
コンソール出力は次のとおりです。
$ ./chroot-poll.sh
chrooting into the target...
i am exiting
chrooting into the target...
[1]+ Stopped ./chroot-poll.sh
なぜこれが止まるのですか?前景にインポートすると、再度繰り返してfg
再び停止します。
端末で実行すると正常に動作します。
./chroot-poll.sh
コンテンツを端末に直接コピーして貼り付けると、期待どおりに機能します。
$ while sleep 1; do echo "chrooting into the target..."; sleep 1 ; sudo chroot /mnt/myrootfs /bin/bash --rcfile /tmp/hello.sh; done
chrooting into the target...
i am exiting
chrooting into the target...
i am exiting
chrooting into the target...
i am exiting
chrooting into the target...
i am exiting
chrooting into the target...
^C
質問
スクリプトの内容は端末で実行できますが、スクリプト自体は実行できないのはなぜですか?
答え1
この質問に私が追加できないものがあります。私の考えでは、これが本文に関連していると思います。
[1]+ Stopped ./chroot-poll.sh
&
バックグラウンドでプロセスを実行するときにのみこのようなテキストを見ましたが、問題の余地はなく、バックグラウンドでタスクを実行することについては言及しませんでした。他の人が指摘したように、エラーを再現することはできません。とは別にバックグラウンドでスクリプトを実行すると。
スクリプトを実行しようとすると、同様の結果を得るのではなく、バック./chroot-poll.sh &
グラウンド./chroot-poll.sh
で実行していると想定できます。
通常、ジョブが入ってStopped
バックグラウンドで実行されている間に標準入力からデータを読み取ろうとします。これに対する非常に簡単な解決策は、次のように読むことです/dev/null
。
./chroot-poll.sh < /dev/null
/dev/null
これにより、何かを読み取ろうとすると標準入力ではなくstdinから読み取られます。
私はインタラクティブモードでbashを実行しているので、最終的にこれが起こると思います。スクリプトの実行を要求するのではなく、上書きするだけです~/.bashrc
。 bashはまだプロンプトに何かを入力すると予想されるようexit
にstdinからデータを読み取ります。 bashにスクリプトをスクリプトとして読み取るには、次のようにします。
sudo chroot /mnt/myrootfs /bin/bash -f /tmp/hello.sh