2012-02-09 6 views
1

В приглашении, я могу напечатать:правило интерполяции при определении функции

 
$ e() { echo $1; } 

и получить функцию, которая перекликается своим первым аргументом. Я не понимаю, почему это работает. Так как $ 1 не определено в текущей среде, кажется, что выше должно быть эквивалентно:

 
$ e() { echo ; } 

Что соответствующего правила процитировать/интерполяции, которая позволяет это поведение? Обратите внимание, что это не имеет никакого отношения к $1, являющемуся особенным: если вы используете $FOO, вы получаете функцию, которая перекликается со значением $FOO во время вызова функции, а не значением $FOO, когда функция определена.

ответ

1

Не знаю, как я пропустил это, так как это довольно ясно, в разделе 2.9.5:

Когда функция объявлена, ни один из разложения в wordexp не должны быть выполнены по тексту в составной команде или io-redirect; все разложения должны выполняться как обычно каждый раз, когда вызывается функция. Аналогичным образом, необязательные переадресации io-redirect и любые назначения переменных в составной команде должны выполняться во время выполнения самой функции, а не определения функции. См. «Последствия ошибок оболочки» для последствий сбоев этих операций в интерактивных и неинтерактивных оболочках.

+0

Иными словами, код внутри объявления функции запускается при запуске функции, а не при ее создании. – l0b0

0

Переменные типа $1 представляют собой специальные переменные, представляющие параметры, переданные из командной строки. Смотрите раздел «Позиционные параметры» здесь: http://tldp.org/LDP/abs/html/internalvariables.html

+0

Точно так же происходит с $ FOO вместо $ 1 –

Смежные вопросы