Есть ли способ для скомпилированной программы командной строки сообщить bash или csh, что она не хочет, чтобы какие-либо подстановочные знаки в ее параметрах расширялись?
Например, вам может понадобиться такая команда оболочки, как:
foo *
просто вернуть числовое значение ASCII этого символа.
pwd
,echo *
это просто*
nullglob
отключена, слово остается без изменений. Еслиnullglob
опция установлена и совпадений не найдено, слово удаляется».set -f
? Это такunset -f
?set +f
Хотя верно, что команда сама по себе не может отключить подстановку подстановки, пользователь может указать оболочке Unix не подменять конкретную команду. Обычно это достигается путем редактирования файлов конфигурации оболочки. Предполагая, что команду
foo
можно найти по пути к команде, в соответствующий файл конфигурации необходимо добавить следующее:Для оболочек sh, bash и ksh:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
Для оболочек csh и tcsh:
alias foo 'set noglob;\foo \!*;unset noglob'
Для оболочки zsh:
alias foo='noglob foo'
Путь к команде использовать не обязательно. Скажем, команда foo хранится в каталоге ~ / bin, тогда приведенное выше будет выглядеть так:
Для оболочек sh, bash и ksh:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
Для оболочек csh и tcsh:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
Для оболочки zsh:
alias foo='noglob ~/bin/foo'
Все вышеперечисленное было протестировано с использованием Apple OSX 10.9.2. Примечание. При копировании приведенного выше кода будьте осторожны, не удаляя пробелы. Они могут быть значительными.
Обновить:
Пользователь Гейра указал, что в случае оболочки bash
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
можно заменить на
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;} alias foo='set -f;reset_expansion ~/bin/foo'
что устраняет необходимость в функции foo.
Некоторые веб-сайты, использованные для создания этого документа:
Оболочка Unix
Передача аргументов командной строки команде псевдонима Bash
Csh - оболочка C
Встроенные команды Bash
Сравнение с последовательностью запуска оболочки Bourne и csh
Цикл псевдонима в csh
Как передать аргументы командной строки псевдониму оболочки?
Вызов программы, когда функция bash имеет то же имя
Специальные переменные оболочки
Псевдонимы оболочки C с аргументами командной строки
Предотвращение расширения / подстановки подстановочных знаков в сценариях оболочки
источник
Расширение выполняется оболочкой перед запуском вашей программы. Ваша программа не знает, произошло расширение или нет.
set -o noglob
отключит раскрытие в вызывающей оболочке, но вам придется сделать это до вызова программы.
Альтернативный вариант - процитировать ваши аргументы, например
foo "*"
источник
set -o noglob
для отключения подстановочного знака.Будьте осторожны: если нет имен, соответствующих маске, bash передает аргумент как есть, без раскрытия!
Доказательство (pa.py - очень простой скрипт, который просто выводит свои аргументы):
$ ls f1.cc f2.cc pa.py $ ./pa.py *.cc ['./pa.py', 'f1.cc', 'f2.cc'] $ ./pa.py *.cpp ['./pa.py', '*.cpp']
источник
set -o nullglob
илиshopt -s failglob
, и это поведение изменится (двумя очень разными способами).