Когда действует псевдоним оболочки? - PullRequest
0 голосов
/ 02 мая 2018

Я прочитал раздел «Подстановка псевдонимов» в спецификации POSIX, но, похоже, не могу понять это.

Рассмотрим эти два сценария:

alias x="echo hello"
x

и

if true; then
    alias x="echo hello"
    x
fi

В двух протестированных мною оболочках (dash и zsh) у обоих одинаковое поведение. Первый скрипт печатает «привет», а второй скрипт выдает ошибку, потому что x не является командой.

Из этих тестов кажется, что псевдоним вступает в силу в начале следующего complete_command в грамматике POSIX. Если это тот случай, когда это указано в спецификации POSIX?

1 Ответ

0 голосов
/ 03 мая 2018

См. Спецификацию POSIX для замены псевдонима .

Замена псевдонимов происходит во время синтаксического анализа (или, по крайней мере, до оценки). Поскольку весь оператор if является одной составной командой, которая анализируется одновременно, это означает, что x подвергается замене псевдонима до , предыдущая команда alias фактически определяет псевдоним и может быть заменена только псевдоним, определенный в полной командной строке перед оператором if.

Например, рассмотрим код

alias x="echo hello"
if true; then
    x
fi

После разбора это преобразуется в код

alias x="echo hello"
if true; then
    echo hello
fi

и , что - это код, который фактически выполняется.

Теперь рассмотрим

alias x="echo hello"
if true; then
    alias x="echo goodbye"
    x
fi
x

Опять же, во время синтаксического анализа оператора if, x определяется как echo hello, а не echo goodbye. После if анализируется и выполняется, однако, x было переопределено, поэтому вышеприведенное эквивалентно

alias x="echo hello"
if true; then
    alias x="echo goodbye"
    echo hello
fi
echo goodbye
...