Bash: Почему * не возвращает пустую строку в случае отсутствия совпадения

Bash: Почему * не возвращает пустую строку в случае отсутствия совпадения

Я не понимаю, почему * возвращает себя, когда нет совпадений. Этоотвечатьутверждает, что это так, но я не понимаю обоснования такого поведения. Почему * или любой общий шаблон не возвращает пустую строку в случае отсутствия совпадения?

$ls      # Look, no files
$touch a # Add a file
$echo *  # Works as expected
a
$rm a    # Remove the file
$echo *  # Will output a '*'. Why not ''?
*
$*       # Ok, * will fail, but how come the previous output?
-bash: *: command not found
$

решение1

Шаблоны, которые не соответствуют ни одному файлу, считаются ошибкой. Вы можете увидеть это в самых первых версиях unix.

шарвыведет ошибку, а переданная команда никогда не будет выполнена.

Сообщение об ошибке было"Не совпадает".

В вашей современной оболочке, полученной изБорн (Unix версии 7), ls -l *.cвыдаст ошибку "*.c: Нет такого файла или каталога". Я бы сказал, что это сообщение легче понять; также оно указывает на шаблон, который дал сбой.

Обратите внимание, что если бы *.cон был расширен до пустого значения, то ls -l *.cвместо этого отображались бы все файлы в каталоге, а ошибка не выводилась бы.

В bash есть failglobопция поведения, более близкая к оригиналу.

решение2

Символ * на самом деле раскрывается bash (какой бы ни была ваша оболочка), а затем передается вэхо.эхокоманда ничего не делает, только выводит на стандартный вывод. Прочитайте этот документ -Расширение имени файла. Там написано-

Bash сканирует каждое слово на наличие символов "*", "?" и "[". Если появляется один из этих символов, то слово рассматривается как ШАБЛОН и заменяется отсортированным в алфавитном порядке списком имен файлов, соответствующих шаблону. Если соответствующие имена файлов не найдены, а опция оболочки nullglob отключена, слово остается без изменений. Если опция nullglob установлена ​​и совпадений не найдено, слово удаляется.

Таким образом, на самом деле, когда bash не может найти совпадений, он оставляет «*» без изменений, а echo выводит это.

Причина Причина, по которой bash не возвращает пустой оператор по умолчанию, заключается в том, что могут быть случаи, когда пользователь не хочет использовать '*' в качестве подстановочного знака, и поэтому ему не нужно расширение '*'. И, следовательно, в этом случае расширение '*' до пустой строки будет ошибочным. Однако это поведение по умолчанию можно переопределить с помощью nullglobпараметра.

Связанный контент