В руководстве Bash сказано
Первое слово замещающего текста проверяется на псевдонимы, но слово, которое идентично раскрываемому псевдониму , не раскрывается второй раз. Это означает, что можно использовать псевдонимы от
ls
доls -F
для экземпляр, и Bash не пытается рекурсивно расширять замену текст.
Я пытаюсь выяснить, какой псевдоним следует за «идентичным» в цитате,
любой псевдоним, расширяемый в той же последовательности рекурсий раскрытия псевдонима, или
псевдоним, раскрытие которого было начато первым, или
псевдоним, расширение которого было запущено в последний раз.
Итак, я создаю пример
$ alias a1=a2;
$ alias a2=a3;
$ alias a3=a4;
и хочу проверить результат расширения псевдонима a1
в следующих случаях
$ alias a4=a1;
или
$ alias a4=a2;
или
$ alias a4=a3;
Как я могу проверить расширение псевдонима результат a1
, возможно, выполнив расширение псевдонима на a1
, не позволяя оболочке идти дальше, чем расширение псевдонима?
В руководстве говорится, что оболочка будет избегать любых циклов, которые могут быть вызваны рекурсией раскрытия псевдонимов.
В вашем примере (a1=a2=a3=a4
), если вы выполняете alias a4=a1
, вы создаете цикл. Затем, как только вы выполнитеa1
(соотв. a2
, a3
, a4
), как только оболочка возвращается кa1
(соотв. a2
, a3
,a4
)он будет искать команду с именемa1
(соответственно. a2
, a3
, a4
), который НЕ является псевдонимом (, так как это создало бы никогда -не заканчивающийся цикл ).
Пример:
$ a1() { echo Phew, I got out of the loop; }
$ alias a1='echo "(a1)"; a2' a2='echo "(a2)"; a3'
$ alias a3='echo "(a3)"; a4' a4='echo "(a4)"; a1'
$ a1
(a1)
(a2)
(a3)
(a4)
Phew, I got out of the loop
$ a2 # Command a2 does not exist anywhere
(a2)
(a3)
(a4)
(a1)
a2: command not found
:> alias e="echo "
:> alias text=foo
:> e text
foo
Технически оболочка идет дальше расширения псевдонимов, но, тем не менее, я думаю, что вы имели в виду именно это.