Параметр nullglob
(который, кстати, является изобретением zsh
, добавлен только спустя годы в bash
( 2.0
)) не будет быть идеальным в ряде случаев. И ls
- хороший пример:
ls *.txt
Или его более правильный эквивалент:
ls -- *.txt
С nullglob
on будет запускать ls
без аргумента, который рассматривается как LS -.
(перечислить текущий каталог), если файлы не совпадают, что, вероятно, хуже, чем вызов ls
с литералом *. Txt
в качестве аргумента.
У вас будут аналогичные проблемы с большинством текстовых утилит:
grep foo *.txt
будет искать foo
на стандартном вводе, если нет файла txt
.
Более разумное значение по умолчанию, например csh, tcsh, zsh или fish 2.3+ (и ранние оболочки Unix), - это полная отмена команды, если глобус не совпадает.
bash
(начиная с версии 3) для этого имеет параметр failglob
(интересно для данного обсуждения, поскольку в отличие от ash
, AT&T ksh
или zsh
, bash
не поддерживает локальные области для параметров (хотя это будет изменено в 4.4), этот параметр, когда он включен глобально, нарушает некоторые вещи, такие как функции завершения bash).
Обратите внимание, что csh и tcsh немного отличаются от zsh
, fish
или bash -O failglob
в таких случаях, как:
ls -- *.txt *.html
Где вам нужны все globs не совпадают для отменяемой команды.Например, если есть один файл txt и нет файла html, он выглядит следующим образом:
ls -- file.txt
Вы можете получить такое поведение с помощью zsh
с помощью setopt cshnullglob
, хотя это более разумный способ сделать это в zsh
будет использовать глобус, например:
ls -- *.(txt|html)
В zsh
и ksh93
, вы также можете применить nullglob к per- glob, что является более разумным подходом, чем изменение глобального параметра:
files=(*.txt(N)) # zsh
files=(~(N)*.txt) # ksh93
создаст пустой массив, если нет файла txt
, вместо того, чтобы выполнить команду с ошибкой (или сделать его массивом с одним *. Txt
буквальный аргумент с другими оболочками).
Версии fish
до 2.3 будут работать как bash -O nullglob
, но выдают предупреждение при интерактивном взаимодействии, когда глобус не имеет соответствия. Начиная с 2.3, он работает как zsh
, за исключением глобусов, используемых в для
, set
или count
.
Теперь, что касается истории, поведение было фактически нарушено оболочкой Борна. В предыдущих версиях Unix подстановка глобусов выполнялась с помощью помощника / etc / glob
, и этот помощник вел себя как csh
: он не выполнял команду, если ни один из глобусов не соответствовал ни одному файлу, и удалял в противном случае шары не совпадают.
Итак, ситуация, в которой мы находимся сегодня, возникла из-за плохого решения, принятого в оболочке Борна.
Обратите внимание, что оболочка Bourne (и оболочка C) поставлялась с еще одной новой функцией Unix: средой. Это означало расширение переменных (его предшественник имел только позиционные параметры $ 1
, $ 2
...).Оболочка Bourne также ввела подстановку команд.
Другим неудачным дизайнерским решением оболочки Bourne было выполнение глобализации (и разделения) при раскрытии переменных и подстановке команд (возможно, для обратной совместимости с оболочкой Томпсона, где echo $ 1
по-прежнему будет вызывать ] / etc / glob
if $ 1
содержал символы подстановки (там это больше походило на расширение макроса препроцессора, поскольку в расширенном значении снова было проанализировано как код оболочки)).
Неудачные несовпадающие глобусы означают, например, что:
pattern='a.*b'
grep $pattern file
приведет к сбою команды (если в текущем каталоге нет файлов a.whateverb
). csh
(который также выполняет подстановку подстановки при расширении переменной) не выполняет команду в этом случае (и я бы сказал, что это лучше, чем оставлять там неактивную ошибку, даже если это не так хорошо, как отсутствие подстановки вообще как в zsh
).
Я использую startx
отлично (Нестабильный Debian + экспериментальный ). Если вы посмотрите, где установлены переменные окружения dbus (снова ), они находятся в /etc/X11/Xsession.d/20dbus_xdg-runtime
. Я использую свой собственный .xinitrc
, и я понял, что куча проблем, которые у меня возникли из-за того, что я не использовал сценарии в /etc/X11/Xsession.d
(, как это делает по умолчанию xinitrc
). Вместо того, чтобы пытаться запустить dbus-update-activation-environment
самостоятельно, я настоятельно рекомендую вам использовать исходные файлы в /etc/X11/Xsession.d
вместо (, они добавляют кучу других вещей, таких как изменение ваших xhost
настроек ).