Оболочка выполняет расширение глобуса еще до того, как подумает о вызове команды. Такие программы, как grep, ничего не делают для предотвращения подстановки: они не могут. Вы, как вызывающая сторона этих программ, должны сообщить оболочке, что вы хотите передать программе специальные символы, такие как *
и ?
, и не позволять оболочке интерпретировать их. Вы делаете это, помещая их в кавычки:
grep -E 'ba(na)* split' *.txt
(ищите ba split
, bana split
и т. д. во всех файлах с именем ‹something›.txt
) В этом случае помогут либо одинарные, либо двойные кавычки. Между одинарными кавычками оболочка ничего не расширяет. Между двойными кавычками $
, `
и \
по-прежнему интерпретируются. Вы также можете защитить один символ от расширения оболочки, поставив перед ним обратную косую черту. Необходимо защищать не только подстановочные знаки; например, выше пробел в шаблоне заключен в кавычки, поэтому он является частью аргумента grep
, а не разделителем аргументов. Альтернативные способы написания приведенного выше фрагмента включают
grep -E "ba(na)* split" *.txt
grep -E ba\(na\)\*\ split *.txt
В большинстве оболочек, если аргумент содержит подстановочные знаки, но шаблон не соответствует ни одному файлу, шаблон остается неизменным и передается базовой команде. Итак, команда типа
grep b[an]*a *.txt
имеет различный эффект в зависимости от того, какие файлы присутствуют в системе. Если текущий каталог не содержит ни одного файла, имя которого начинается с b
, команда ищет шаблон b[an]*a
в файлах, имя которых соответствует *.txt
. Если текущий каталог содержит файлы с именами baclava
, bnm
и hello.txt
, команда расширяется до grep baclava bnm hello.txt
, поэтому она ищет шаблон baclava
в двух файлах bnm
и hello.txt
. Излишне говорить, что полагаться на это в сценариях — плохая идея; в командной строке иногда можно сэкономить на наборе текста, но это рискованно.
Когда вы запускаете ack .*
в каталоге, не содержащем точечный файл, оболочка запускает ack . ..
. Поведение команды ack
состоит в том, чтобы рекурсивно распечатать все непустые строки (шаблон .
: соответствует любому одному символу) во всех файлах под ..
(родительским для текущего каталога). В отличие от ack '.*'
, который ищет шаблон .*
(который соответствует чему-либо) в текущем каталоге и его подкаталогах (из-за поведения ack
, когда вы не передаете аргумент имени файла).
person
Gilles 'SO- stop being evil'
schedule
24.05.2011