-1

Я попытался запустить скрипт во вновь открытой zsh-сессии, которая была

$ perl -e "for (1 .. 80000000) { print qq#$_\n# }"

Итак, мне нужно было некоторое время, чтобы набрать его, потом потребовалось некоторое время и ничего не делать, и через несколько секунд (около 5-10 секунд) он напечатал тысячи ...

/etc/motd
/etc/motd
/etc/motd
/etc/motd
/etc/motd
/etc/motd
/etc/motd
/etc/motd
...

Мне было интересно, почему это произошло, и я подумал, что я могу запустить его снова, но с меньшим числом, чтобы перейти к:

$ perl -e "for (1 .. 80) { print qq#$_\n# }" 

Я получил это сообщение тогда:

Backslash found where operator expected at -e line 1, near "motd\"
syntax error at -e line 1, near "motd\"
Missing right curly or square bracket at -e line 1, at end of line
Execution of -e aborted due to compilation errors.

Затем я попытался запустить его снова, и сообщение об ошибке стало:

syntax error at -e line 1, near ") {"
Missing right curly or square bracket at -e line 1, at end of line
Execution of -e aborted due to compilation errors.

и иногда:

Having no space between pattern and following word is deprecated at -e line 1.
Backslash found where operator expected at -e line 1, near "td\"
syntax error at -e line 1, near ") {"
Missing right curly or square bracket at -e line 1, at end of line
Execution of -e aborted due to compilation errors.

хотя сам код не изменился.

Я думал, что это как-то связано с /etc /motd в моем .zshrc или чем-то вроде того, что "он загружал его прямо сейчас", но это имело бы смысл, только если оно не появилось через несколько минут после открытия оболочки.

Кроме того, это странное поведение появляется каждый раз, когда я открываю новую вкладку в "Konsole" (с zsh 4.3.17 и perl 5.14.2).

Интересно, что когда я пытался выяснить мою perl-версию с

perl -v

и я снова запустил скрипт, он дал мне:

-v
-v
-v
-v
-v
-v
...

а потом снова ошибки. эхо $ _ с konsole дает мне:

$ echo $_
for (1 .. 80000000) { print qq#for (1 .. 80000000) { print qq#for (1 .. 80000000) { print qq#-v
# }
# }
# }

Я просто не могу понять, что там происходит. Итак, вопрос: что там происходит?

1 ответ1

1

В двойных кавычках оболочка будет расширять $_ что означает

Последний аргумент предыдущей команды. Кроме того, этот параметр устанавливается в среде каждой выполняемой команды с полным путем к команде.

в соответствии с man-страницей Zsh. Поскольку эта переменная принимает разные значения, вы впоследствии получите разные результаты при запуске одной и той же командной строки.

Итак, либо используйте одинарные кавычки, чтобы предотвратить большинство расширений оболочкой для встроенных скриптов perl (что является хорошей идеей):

$ perl -e 'for (1 .. 80000000) { print qq#$_\n# }'

Или избежать знака доллара:

$ perl -e "for (1 .. 80000000) { print qq#\$_\n# }"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .