Новый псевдоним недоступен после;

9

До сих пор я думал, что точка с запятой в оболочке имеет (как-то) то же значение, что и разрыв строки. Поэтому я был удивлен, что для

alias <name>=<replacement text>; <name>

<name>неизвестно, пока известно в следующей строке. csh, tcsh, sh, kshИ bashведут себя так же. По крайней мере, для cshнего не имеет значения, используется ли псевдоним непосредственно или сценарий получен перед точкой с запятой - псевдонимы неизвестны после, ;но известны в следующей командной строке. Это ошибка или это поведение предназначено?

user3224237
источник
«Я думал, что точка с запятой в оболочке имеет (как-то) то же значение, что и разрыв строки» Почти. Не совсем!
Гонки легкости на орбите
1
Интерпретация точки с запятой и новой строки зависит от того, как называется парсер. Для команды «точка» оболочка Bourne вызывает синтаксический анализатор с «NLFLG», который говорит ему, что в некоторых ситуациях символ перевода строки и точка с запятой должны быть равны, но в других случаях это не так. В общем, точка с запятой и разрыв строки не эквивалентны, так как вы можете иметь разрыв строки, где точка с запятой может вызвать синтаксическую ошибку.
Schily

Ответы:

9

Используемый вами псевдоним синтаксиса не подходит для оболочки POSIX, для оболочки POSIX вам необходимо использовать:

alias name='replacement'

Но для всех оболочек это не может работать, поскольку замена псевдонима выполняется в самом начале синтаксического анализатора.

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

Если псевдоним появится в следующей командной строке, он будет работать.

Шили
источник
Кроме того, некоторые оболочки любят yashили zshне расширяют псевдоним в shell -c 'alias name=replacement<newline>replacement'. Для AT & T у kshвас возникнет проблема с исходными текстами.
Стефан Шазелас
Мне нужно использовать csh в этом случае - там не =используется в aliasсинтаксисе.
user3224237
@ user3224237 - это не имеет ничего общего с =. это происходит потому, что расширение псевдонима происходит, когда оболочка впервые видит строку, то есть до того, как вы определите псевдоним.
Cas
@ Stéphane Chazelas Поведение в сценариях с "источником" вызвано тем, что оболочка Bourne полностью анализирует такие файлы перед их выполнением. Ksh основан на источнике Bourne Shell, и все, что не было изменено, ведет себя одинаково.
Schily
@schily, да, это та же самая причина того, zsh/yash -c 'code'где codeанализируется в целом. Кажется, это не относится к оболочке Борна. Так что я предполагаю, что оболочка Bourne разбирает codeодну строку за раз.
Стефан Шазелас
5

Это поведение предназначено и определено POSIX под Псевдонимом Подстановки .

Псевдоним был заменен сразу после того, как оболочка выполнила распознавание токена и до применения любых правил грамматики . В то время, когда вы вызывали псевдоним <name>, команда aliasне была выполнена.

cuonglm
источник