Является ли globbing особенностью оболочки?

12

Я прочитал много вопросов и ответов, как этот и этот

Я знаю, что подстановочные знаки раскрываются оболочкой перед выполнением команды, и они являются функцией оболочки. Также подстановочные знаки работают с теми командами, которые могут принимать много аргументов. В find . -name *.rb случае мы имеем более одного файла в текущем каталоге findдаст нам сообщение об ошибке , потому что находка не может принимать несколько аргументов и пути решения этого являются:

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb

Мы избегаем звездочки и предотвращаем расширение оболочкой, но подстановочные знаки - это особенность оболочки; когда мы убегаем, оболочка звездочки не знает о ее значении и должна найти файл с именем *.rb, так как же в этом случае расширяется звездочка?

Sinoosh
источник

Ответы:

21

Да, оболочка понимает *как все файлы с любыми символами в каталоге и *.rbкак все файлы с любыми символами и окончанием .rb, и расширяет его как таковой.

Сама findкоманда принимает глобирование.

Если вы не заключите в кавычки, *то оболочка развернет его до того, как findкоманда увидит свой аргумент, поэтому вместо глобуса *.rbпередаются findимена всех файлов, соответствующих глобусу в каталоге find, и они findбудут пытаться их интерпретировать. в качестве аргументов, которые, скорее всего, приведут к ошибке или, по крайней мере, не к тому, что вы хотите (это будет работать правильно, только если в текущем каталоге нет подходящих файлов)

Занна
источник
спасибо, это означает, что мы говорим, что shell это не глобус, но некоторые команды могут расширять символы подстановки? или мы можем сказать, что если у нас есть оболочка без понимания глобализации, то эти команды знают, что глобализация может их расширить?
Sinoosh
5
если он заключен *в кавычки, то оболочка его не расширит, и аргумент, включающий глоб, будет передан команде, которая может понять глобус, - то же самое для любых команд, которые принимают регулярные выражения, которые всегда должны заключаться в кавычки ...
Занна
1
Мое удовольствие ^ _ ^
Занна
7
@Sinoosh: обратите внимание, что не все команды понимают синтаксис glob. Это просто особенностьfind
slebetman
1
@Sinoosh Find на самом деле не «расширяет» шаблон, он использует его в качестве теста для соответствия каждому имени файла, с которым сталкивается. Существует (очень) несколько команд, которые расширяют подстановочные знаки в общепринятом смысле - например, unzip и 7z могут использовать его для открытия нескольких архивов (когда их аргументы обычно имеют форму " [archive filename single argument] [list of files to extract]").
Random832 22.09.16