説明する

説明する

説明する

コマンドを含む同じループはchroot端末で実行できますが、シェルスクリプトでは実行できません。

生殖

  1. デフォルト(またはユーザーの)rootfsの作成/mnt/myrootfs

  2. 次の内容でファイルを作成し/mnt/myrootfs/tmp/hello.shて実行可能にします。

    #!/bin/bash
    echo "i am exiting."
    exit 
    
  3. 次のスクリプト(./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

おすすめ記事