Я считал много вопросов и ответов как это и этот
Я знаю, что подстановочные знаки расширены оболочкой прежде, чем выполнить команду, и они - функция оболочки. Также подстановочные знаки работают с теми командами, которые могут принять много аргументов. В find . -name *.rb
если у нас есть больше чем один файл в текущем каталоге find
даст нам ошибку, потому что находка не может принять несколько аргументов и способы решить, это:
find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb
Мы выходим из звездочки и предотвращаем расширение оболочкой, но подстановочные знаки являются функцией оболочки; то, когда мы выходим из оболочки звездочки, не знает о ее значении, и она должна найти файл названным *.rb
, таким образом, как звездочка расширяет в этом случае?
Да, оболочка понимает *
как все файлы с любыми символами в каталоге и *.rb
как все файлы с любыми символами и заканчивая .rb
, и расширяет его как таковой.
Сама команда find
принимает глобирование.
Если вы не заключите в кавычку *
, то оболочка расширит его до того, как команда find
увидит свой аргумент, поэтому вместо глобуса *.rb
, переданного find
, имена всех файлов, соответствующих глобусу в каталоге, будут переданы find
, и find
попытается интерпретировать их как аргументы, которые, вероятно, приведут к ошибке или, по крайней мере, не к тому, что вы хотите (это будет работать правильно только если в текущем каталоге нет подходящих файлов)