Bash

chroot 在 while 循環中多次執行失敗

  • August 26, 2021

描述

包含chroot命令的相同循環可以在終端中執行,但不能在 shell 腳本中執行。

再生產

  1. /mnt/myrootfs
  2. 使用以下內容創建一個文件/mnt/myrootfs/tmp/hello.sh(並使其可執行):
#!/bin/bash
echo "i am exiting."
exit 
  1. 創建以下腳本 ( ./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]+  Stopped                 ./chroot-poll.sh

在後台執行程序時,我只看到過這樣的文本,但&問題中沒有任何內容,而且您沒有提到在後台執行作業。正如其他人所說,除非我在後台執行腳本,否則我無法重現您的錯誤。

當我嘗試執行你的腳本時,我得到的結果與你./chroot-poll.sh &相似./chroot-poll.sh,所以我只能假設你是在後台執行它。

通常,作業Stopped在後台執行並嘗試從標準輸入讀取時會進入。對此非常簡單的解決方法是改為讀取/dev/null

./chroot-poll.sh < /dev/null

這樣,當任何嘗試讀取時,它將/dev/null從標準輸入而不是從標準輸入讀取。


我相信這最終會發生,因為您在互動模式下執行 bash。您不是要求它執行腳本,只是覆蓋~/.bashrc. 儘管exitbash 仍在從標準輸入讀取數據,就好像它希望您在提示符下鍵入內容一樣。要讓 bash 將腳本作為腳本讀取,請使用:

sudo chroot /mnt/myrootfs /bin/bash -f /tmp/hello.sh

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