Как я могу "посмотреть за" расширением аргумента командной строки bash? - PullRequest
3 голосов
/ 02 августа 2010

Я хочу, чтобы скрипт Perl принимал подстановочные знаки (foo - *. Ba?) Для имен файлов (которые затем обрабатываются для целого поддерева каталога).

Конечно, я могу сообщить пользователям моегоскрипт для цитирования аргумента ('foo - *. ba?'), но это не совсем элегантно - метод подстановочных знаков предназначен для удобной альтернативы передаче регулярных выражений (которые тоже принимаются и которые, конечно, должно быть в кавычках).Проблема в том, что оболочка (в моем случае bash) расширяет командную строку до файлов, соответствующих шаблону подстановочных знаков в текущем каталоге, поэтому мой плохой сценарий получает предустановку @ARGV с любым найденным bash (обычно ничего или с кучей)foo-lotsof.baz и т. д.).

Есть ли где-нибудь копия нерасширенной командной строки bash?

Ответы [ 5 ]

4 голосов
/ 02 августа 2010

Согласно странице руководства bash, вы можете отключить расширение символов *,? и [с ключом -f. См. Расширение пути.

$ bash -f -c 'ls *'
ls: *: No such file or directory

Но тогда вы должны попросить своих пользователей изменить способ запуска bash или попытаться получить контроль над этим. Это просто перекладывает проблему вокруг себя.

Ваша программа должна иметь дело с поведением оболочки, а не наоборот.

РЕДАКТИРОВАТЬ: В качестве последнего замечания я хотел бы отметить, что использование одинарных кавычек является обычной практикой в ​​оболочках Unix в качестве средства предотвращения расширения. Вы не должны бояться делать то же самое со своим собственным сценарием.

4 голосов
/ 02 августа 2010

Пожалуйста, не , попробуйте , чтобы обойти это.Изменение интерпретации аргументов производится пользователем при выборе им цитирования.Даже если вы можете (и я знаю, что в bash есть хуки, о которых я ничего не знаю, это может сделать это возможным), вы не обеспечите лучший пользовательский опыт таким образом, вы будете хуже.

3 голосов
/ 05 мая 2011

Один дополнительный ответ для людей, приходящих на этот вопрос только для того, чтобы не найти ничего полезного: Рассмотрим мое решение для предотвращения расширения подстановочных знаков (globbing), здесь .

Суть его была изложена в этом связанном ответе .

3 голосов
/ 02 августа 2010

Боюсь, что нет простого способа обойти это. bash расширяет подстановочные знаки перед выполнением команды. вот почему вы должны указывать параметры в find -name '*.txt' - если вы не используете bash, вы попытаетесь расширить шаблон, и вы получите не те результаты, которые вы хотели

2 голосов
/ 02 августа 2010

Bash расширяет символы подстановки, а затем передает их в программу. Это функция bash, и именно так работает bash, поэтому я не думаю, что вы сможете найти способ обойти это. (Интересно, что оболочка командной строки Windows не расширяет подстановочные знаки, поэтому вам нужно сделать несколько болезненных обходных путей, чтобы заставить сценарии Perl работать должным образом.)

Указание имен файлов является стандартным решением, и пользователи командной строки Linux должны быть с ним хорошо знакомы.

В других программах (таких как find (1) ) возникает та же проблема, что и в кавычках аргументов, которые используют символы подстановки.

(Даже если бы вы могли найти какой-нибудь способ запросить историю командной строки bash из вашего скрипта Perl, чтобы найти команду по мере ее ввода, у вас все равно будут проблемы с запуском вашего скрипта из других оболочек, других скриптов, и др.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...