Bash
chroot 在 while 循環中多次執行失敗
描述
包含
chroot
命令的相同循環可以在終端中執行,但不能在 shell 腳本中執行。再生產
- 在
/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]+ Stopped ./chroot-poll.sh
在後台執行程序時,我只看到過這樣的文本,但
&
問題中沒有任何內容,而且您沒有提到在後台執行作業。正如其他人所說,除非我在後台執行腳本,否則我無法重現您的錯誤。當我嘗試執行你的腳本時,我得到的結果與你
./chroot-poll.sh &
相似./chroot-poll.sh
,所以我只能假設你是在後台執行它。通常,作業
Stopped
在後台執行並嘗試從標準輸入讀取時會進入。對此非常簡單的解決方法是改為讀取/dev/null
:./chroot-poll.sh < /dev/null
這樣,當任何嘗試讀取時,它將
/dev/null
從標準輸入而不是從標準輸入讀取。我相信這最終會發生,因為您在互動模式下執行 bash。您不是要求它執行腳本,只是覆蓋
~/.bashrc
. 儘管exit
bash 仍在從標準輸入讀取數據,就好像它希望您在提示符下鍵入內容一樣。要讓 bash 將腳本作為腳本讀取,請使用:sudo chroot /mnt/myrootfs /bin/bash -f /tmp/hello.sh