Шарики Bash как неаргументы файла. Пример: склонный - добираются, удаляют pkg -*

Если я выполняю это с sudo, я все еще отклонил разрешение.

Этим оператором это кажется на попытку команды как:

sudo cat file.wav > /dev/dsp

Причина Вы продолжаете получать "разрешение, отклоненное", состоит в том, что Ваша оболочка сначала пытается открыться /dev/dsp устройство для вывода, прежде, чем выполнить команду (который является sudo). Чтобы иметь оболочку открывают перенаправление с полномочиями пользователя root, необходимо было бы сделать что-то как:

sudo sh -c 'cat file.wav > /dev/dsp'
3
24.12.2014, 22:01
2 ответа

Дело в том, что если PKG - * не соответствует ни одного файла в текущем каталоге, он передается DPKG, как оно есть. Это на самом деле плохое представление. Нужно процитировать это все время. Например: DPKG -L PKG - \ *

3
27.01.2020, 21:23

Вы правы: программы могут видеть свои аргументы только после того, как они расширены оболочкой, они не могут видеть оригинальные подстановочные знаки. Однако, оболочка Bourne и ее преемники (ksh, bash, dash, ...) оставляют подстановочные знаки неоткрытыми, если они совпадают с 0 файлами. Пока в текущей директории нет файла, имя которого начинается с pkg-, dpkg -l pkg* передает два аргумента -l и pkg-* в dpkg.

Это сделано для удобства, чтобы избежать необходимости кавычек символов подстановки в словах, которые не были предназначены для интерпретации в качестве имен файлов и не совпадают с именами файлов. Но некоторые оболочки ведут себя по-другому и могут либо прервать команду, если подстановочные символы не совпадают ни с чем (поведение по умолчанию в csh, tcsh, zsh и fish - за исключением случаев, когда есть несколько последовательных шаблонов, некоторые из них могут не совпадать ни с чем, пока хотя бы один из них не совпадает с файлом) или расширять подстановочные знаки, не совпадающие ни с чем (N модификатор глобуса или null_glob опция оболочки в zsh, N опция шаблона в ksh, nullglob опция оболочки в bash). Последнее поведение имеет преимущество регулярности (несовпадающий шаблон расширяется до списка совпадений, как и тот, который совпадает с одним или несколькими файлами), что делает его предпочтительным в скриптах.

Чтобы гарантировать, что шаблон не будет случайно расширен, процитируйте его подстановочные символы: dpkg -l 'pkg-*' или dpkg -l pkg-\*.

Ни одна из обычных оболочек не знает, какие аргументы каких команд являются файлами (где желателен глобус), а какие - другими вещами, которые в идеале следует оставить в покое. Zsh можно заставить отключить глобирование для конкретной команды, написав перед ней noglob, например noglob dpkg -l pkg-*. ноглоб часто используется в псевдониме типа псевдоним рысь='ноглобная рысь' . Баш "магические псевдонимы", описанные Саймоном Тэтхемом, имитируют zsh's noglob.

0
27.01.2020, 21:23

Теги

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