Если я выполняю это с sudo, я все еще отклонил разрешение.
Этим оператором это кажется на попытку команды как:
sudo cat file.wav > /dev/dsp
Причина Вы продолжаете получать "разрешение, отклоненное", состоит в том, что Ваша оболочка сначала пытается открыться /dev/dsp
устройство для вывода, прежде, чем выполнить команду (который является sudo
). Чтобы иметь оболочку открывают перенаправление с полномочиями пользователя root, необходимо было бы сделать что-то как:
sudo sh -c 'cat file.wav > /dev/dsp'
Дело в том, что если PKG - *
не соответствует ни одного файла в текущем каталоге, он передается DPKG, как оно есть. Это на самом деле плохое представление. Нужно процитировать это все время. Например: DPKG -L PKG - \ *
Вы правы: программы могут видеть свои аргументы только после того, как они расширены оболочкой, они не могут видеть оригинальные подстановочные знаки. Однако, оболочка 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
.