В приведенном вами примере единственное, что eval
получает, это cat
, перенаправление происходит вне eval
, и файл предоставляется как стандартный ввод для команды eval "cat"
.
Один из вариантов заключается в заключении всей команды, включая перенаправление, в одинарные кавычки.:
$ eval 'cat < "$filename"'
hi
Теперь eval
получает всю строку, включая перенаправление и имя переменной, поэтому выполняет раскрытие переменной и необходимые кавычки для имени файла с пробелами. Это все равно сработает.
Другим вариантом является использование двойных кавычек для строки:
$ eval "cat < '$filename'"
hi
Теперь переменная расширяется оболочкой, но это все еще работает, поскольку кавычки внутри нее сохраняют имя файла вместе. (Учтите, что это не работает, если имя файла содержит апостроф.)
Что бы *не работало, так это:
$ eval "cat" "<" "$filename"
Это похоже на ваш пример, но с цитируемым <
перенаправление не будет выполняться внешней оболочкой. Затем eval
объединит аргументы, и результирующая команда будет:
cat < my file
Что не сработает, так как кавычки вокруг my file
исчезли...
После публикации этого квеста я обновил свою систему до Debian 11 (Bullseye ), и с этим обновлением я больше не вижу этого зависания. Я предполагаю, что какой-то пакет DE был виноват и был обновлен в процессе. Я все еще сталкиваюсь со строками «debian -vg» при запуске, но, похоже, это никак не влияет на это.
Эта vg — ваша корневая файловая система для ядра -в настройках ядра при загрузке. Он не найден, поэтому не смонтирован, поэтому ядро не может использовать его как корневую файловую систему.
... root=/dev/mapper/debian--vg-root...
Ядро ранее должно было знать, что ему нужно распознать эту vg, прежде чем ее можно будет использовать как корневую файловую систему.