В bash, если вы сделаете это:
mkdir /tmp/empty
array=(/tmp/empty/*)
вы обнаружите, что array
теперь имеет один элемент, "/tmp/empty/*"
, а не ноль, как вы хотели бы. К счастью, этого можно избежать, включив опцию оболочки nullglob с помощью shopt -s nullglob
Но nullglob является глобальным, и при редактировании существующего сценария оболочки может что-то сломать (например, кто-то проверял код выхода ls foo*
, чтобы проверить, существуют ли файлы, начинающиеся с "foo"?) Итак, в идеале, я хотел бы включить его только для небольшого объема - в идеале, расширение одного имени файла. Вы можете снова отключить его, используя shopt -u nullglob
Но, конечно, только если он был отключен ранее:
old_nullglob=$(shopt -p | grep 'nullglob$')
shopt -s nullglob
array=(/tmp/empty/*)
eval "$old_nullglob"
unset -v old_nullglob
заставляет меня думать, что должен быть лучший способ. Очевидное «поместить его в подоболочку» не работает, поскольку, конечно, присвоение переменной умирает вместе с подоболочкой. Кроме ожидания для группы Austin для импорта синтаксиса ksh93, есть ли?