TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.52K subscribers
Post #629 628
nullglob: когда *.log внезапно превращается в строку

Bash умеет раскрывать glob-шаблоны:

*.log


Но если файлов с таким расширением нет, по умолчанию шаблон может остаться обычной строкой.
Например:

for file in /var/log/*.log; do
echo "$file"
done


Если .log файлов нет, цикл может получить буквально:

/var/log/*.log


Это легко превращается в ошибку в автоматизации.

▪️Включаем nullglob

shopt -s nullglob


Теперь шаблон без совпадений исчезает:

files=(/var/log/*.log)

echo "${#files[@]}"


Если файлов нет: 0
А не 1 с буквальным *.log.

▪️Почему это важно для массивов

Без nullglob:

files=(/tmp/*.tmp)


может создать массив из одного элемента:

/tmp/*.tmp


После:

shopt -s nullglob


получаем действительно пустой массив.

▪️nullglob влияет только на текущий shell

Его можно включить локально внутри функции:

check_logs() {
local old_nullglob
shopt -q nullglob
old_nullglob=$?

shopt -s nullglob

files=(/var/log/*.log)

((${#files[@]})) && printf '%s\n' "${files[@]}"

((old_nullglob == 0)) || shopt -u nullglob
}


Но для простых скриптов обычно достаточно включить настройку в начале.

▪️А если отсутствие файлов должно быть ошибкой?

Тогда существует противоположная настройка:

shopt -s failglob


При отсутствии совпадений Bash выдаст ошибку вместо передачи буквального шаблона дальше.

▪️Почему это важно

Glob кажется простой частью Bash, пока скрипт не запускается на сервере, где ожидаемых файлов просто нет.

nullglob позволяет отличить настоящий список файлов от строки с нераскрытым шаблоном - особенно полезно при работе с массивами, логами и автоматической обработкой каталогов.

BashTex 📱 #bash #linux
  • 👍 4
  • 🔥 2
More from @bash_tex
  1. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  2. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  3. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
  4. Oct 1, 2026flock vs fcntl - почему две блокировки одного файла могут вести себя совершенно по-разному…
  5. Sep 30, 2026DEBUG trap - как Bash выполняет код перед каждой командой В Bash есть специальный DEBUG tr…
  6. Sep 29, 2026tee + process substitution: один поток и несколько получателей Иногда нужно одновременно:…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →