Во втором примере используется цикл while
с перенаправленным вводом.
Он читается как < "$tmpFile"
, и многие оболочки создают для этого случая дополнительную оболочку -. Вы можете попробовать запустить этот скрипт с помощью ksh93
. ksh93
не создает вложенную оболочку -в этом случае.
В вашем конкретном случае причина совсем в другом:
в первом примере вы читаете одну строку из ввода
во втором примере вы читаете до EOF
Команда read
считывает ввод, затем разбивает ввод на IFS
символов, а затем присваивает слова переменным аргументам read
.
Если слов в качестве параметров команды read
больше, чем переменных, последняя переменная получает конкатенацию остальных слов.
Если слов меньше, чем переменных, другим переменным присваивается пустое значение.
Поскольку вы нажали EOF
, у вас не было считанного слова, кроме одной или нескольких переменных в качестве аргумента для read
. Это приводит к тому, что всем переменным присваивается пустое значение.
Итак, произошло нечто, чего вы не ожидали.:EOF
приводит к завершению цикла while
, и вы не видите команды echo
внутри цикла while
, а только последнюю команду echo
после while
. ] в этом случае EOF
.
Этот окончательный вариант echo
теперь печатает содержимое переменной, которое было очищено от нажатия EOF
.
Оказывается, chroot Void не распознают блочные устройства внутри chroot. По-видимому, у Void есть отдельная команда xbps-uchroot
, которая обрабатывает это должным образом. Решение состоит в том, чтобы использовать xbps-uchroot
вместо обычного chroot
.