Причина в порядке, в котором оболочка обрабатывает различные расширения и кавычки. Если вы наберете
напрямуюfind. -name "foo*"
Оболочка удалит кавычки и передаст foo*
в качестве параметра в find
.
Без кавычек оболочка сначала выполнит подстановку для *
, что потенциально может привести к множественным совпадениям, что приведет к путанице find
. Поэтому разумно использовать кавычки.
Но если вы read
выберете строку из файла, переменная будет содержать кавычки. Теперь, когда вы это сделаете
> echo $LINE
"foo*"
> echo "foo*"
foo*
> find. -name $LINE
вы видите, что кавычки $LINE
не будут удалены, в отличие от кавычек для echo "foo*"
. Это связано с тем, что оболочка сначала обрабатывает кавычки echo $LINE
(, а )нет, а затем выполняет подстановку переменных, поэтому строка будет читаться как echo "foo*"
, но теперь кавычки остаются.
Итак, ваш find
будет искать файлы, содержащие кавычки. Решение состоит в том, чтобы оставить кавычки в файле. Там кавычки не нужны, вся строка будет идти в переменную.
Из справочной страницы perlrun
:
perl... [ [-e|-E] 'command' ]...
Все, что следует за параметром -e
, perl обрабатывает как команду. С -nel
, l
является командой для -e
. print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/
является первым аргументом опции, отличной от -, и он становится входным файлом, который perl пытается открыть и терпит неудачу.
Сравните, скажем, с:
~ echo foo | perl -neprint
foo
Опция -e
принимает аргумент, строку, которая будет оцениваться как код Perl. Когда вы используете perl -lne '...'
и perl -nle '...'
, это работает так, как предполагалось, поскольку порядок параметров не важен (в этом случае ).
Однако, когда вы используете perl -nel '...'
, вы говорите «вычислить строку l
как код Perl и использовать '...'
как имя файла, который будет считан этим кодом», что не имеет особого смысла (вот почему вы получаете эту странную ошибку «Нет такого файла или каталога» ).
Таким образом, нет, порядок опций не важен (здесь ), но если вы перемещаете опцию -e
, вы должны переместить аргумент опции -, код Perl, с так, чтобы код Perl всегда шел сразу после этой опции.
Таким образом, если вы хотите, например, поставить параметр -e
первым, используйте
perl -e '...' -ln
Порядок параметров до perl
важен, если вы смешиваете такие параметры, как -p
и -n
в одной командной строке. Опция -p
будет переопределена более поздней опцией -n
и наоборот, поэтому perl -np
совпадает с perl -p
, а perl -pn
совпадает с perl -n
. Это описано в руководстве perlrun
(, см. man perlrun
или perldoc perlrun
).