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


12

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

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

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

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

Ответы:


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.