xinitrc - установить DBUS_SESSION_BUS_ADDRESS

Параметр 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 ).

0
25.04.2018, 23:05
1 ответ

Я использую 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настроек ).

4
28.01.2020, 04:24

Теги

Похожие вопросы