До сих пор я думал, что точка с запятой в оболочке имеет (как-то) то же значение, что и разрыв строки. Поэтому я был удивлен, что для
alias <name>=<replacement text>; <name>
<name>
неизвестно, пока известно в следующей строке. csh
, tcsh
, sh
, ksh
И bash
ведут себя так же. По крайней мере, для csh
него не имеет значения, используется ли псевдоним непосредственно или сценарий получен перед точкой с запятой - псевдонимы неизвестны после, ;
но известны в следующей командной строке. Это ошибка или это поведение предназначено?
Ответы:
Используемый вами псевдоним синтаксиса не подходит для оболочки POSIX, для оболочки POSIX вам необходимо использовать:
Но для всех оболочек это не может работать, поскольку замена псевдонима выполняется в самом начале синтаксического анализатора.
Перед выполнением настройки псевдонима синтаксический анализатор прочитал всю строку, и по этой причине ваша командная строка не будет работать.
Если псевдоним появится в следующей командной строке, он будет работать.
источник
yash
илиzsh
не расширяют псевдоним вshell -c 'alias name=replacement<newline>replacement'
. Для AT & T уksh
вас возникнет проблема с исходными текстами.=
используется вalias
синтаксисе.=
. это происходит потому, что расширение псевдонима происходит, когда оболочка впервые видит строку, то есть до того, как вы определите псевдоним.zsh/yash -c 'code'
гдеcode
анализируется в целом. Кажется, это не относится к оболочке Борна. Так что я предполагаю, что оболочка Bourne разбираетcode
одну строку за раз.Это поведение предназначено и определено POSIX под Псевдонимом Подстановки .
Псевдоним был заменен сразу после того, как оболочка выполнила распознавание токена и до применения любых правил грамматики . В то время, когда вы вызывали псевдоним
<name>
, командаalias
не была выполнена.источник