Я бы хотел узнать, как экранировать кавычки внутри системной команды в
следующий perl oneliner:
$ ls -p | grep -v / | perl -lane 'system("echo \"$_\"");'
без использования escape-последовательности, как показано здесь: [...]
Эти примеры предназначены для экранирования одинарных кавычек, ваш пример использует double quotes \"$_\"
. В Bash все в одинарных кавычках воспринимается буквально (кроме самой одинарной кавычки), то же самое нельзя сказать в двойных кавычках. Например, $
в двойных кавычках не является литералом $
, но указывает на то, что должно следовать расширение переменной.
Теперь в вашем распоряжении три уровня интерпретации цитат.
Сначала внешняя оболочка (командная строка):
perl -lane 'system("echo \"$_\"");'
Тогда интерпретатор Perl:
system("echo \"$_\");
Затем вторая оболочка (здесь используется Bash):
echo "xxx"
где xxx
- расширение $_
в скрипте perl
Ваша команда не содержит внутренних одинарных кавычек, поэтому нет необходимости использовать конструкции цитирования Bash для экранирования одинарных кавычек, например
It's fine -> 'It'"'"'s fine'
или
It's fine -> 'It'\''s fine'
Далее, вам нужно экранировать двойные кавычки в скрипте perl
system("echo \"$_\"")
поскольку они заключены в двойные кавычки, вы можете удалить их
поскольку echo
здесь не нужны двойные кавычки:
system("echo $_")
будет работать нормально, или вы можете сделать, как предложено в комментариях:
system(qq/echo "$_"/)
или используйте форму LIST system
с более чем одним аргументом
system("/bin/echo", $_)
Однако, если вы хотите использовать одинарные кавычки, например:
system('echo ' . $_)
вам нужно вызвать экранирование одинарной кавычки оболочки:
'system('"'"'echo ''"' . $_)'
или (используя двойные кавычки):
"system('echo ' . "'$'"_)"