Из руководства по bash
Правила, касающиеся определения и использования псевдонимов, несколько сбивают с толку. Bash всегда читает по крайней мере одну полную строку ввода перед выполнением любой из команд в этой строке. Псевдонимы раскрываются при чтении команды, а не при ее выполнении. Следовательно, определение псевдонима, отображаемое в той же строке, что и другая команда, не вступает в силу, пока не будет прочитана следующая строка ввода. На команды, следующие за определением псевдонима в этой строке, новый псевдоним не влияет. Такое поведение также является проблемой при выполнении функций. Псевдонимы раскрываются при чтении определения функции, а не при ее выполнении , поскольку определение функции само по себе является составной командой. Как следствие, псевдонимы, определенные в функции, недоступны до тех пор, пока эта функция не будет выполнена . В целях безопасности всегда помещайте определения псевдонимов в отдельной строке и не используйте псевдоним в составных командах.
Два предложения «псевдонимы раскрываются при чтении определения функции, а не при выполнении функции» и «псевдонимы, определенные в функции, недоступны до тех пор, пока эта функция не будет выполнена» кажутся противоречащими друг другу.
Можете ли вы объяснить, что они имеют в виду соответственно?
.bashrc
файлах в самом верху.Ответы:
Псевдонимы раскрываются при чтении определения функции, а не при ее выполнении…
Несмотря на то, что
myfunc
был определен для вызоваmyalias
, и я переопределилmyalias
, по-myfunc
прежнему выполняет исходное определениеmyalias
. Потому что псевдоним был расширен, когда была определена функция. На самом деле, оболочка больше не помнит, чтоmyfunc
звонкиmyalias
; он знает только то, чтоmyfunc
вызываетcat
:... псевдонимы, определенные в функции, недоступны до тех пор, пока эта функция не будет выполнена.
myalias
Псевдоним не доступен , покаmyfunc
функция не будет выполнена. (Я считаю, что было бы довольно странно, если бы определения функции, определяющей псевдоним, было достаточно для определения псевдонима.)источник
Мне нужен ответ, который сформулирован в первом предложении, когда я попробую ниже фрагмент в моем
.bashrc
.после того
unalias -a; source ~/.bashrc
, как я пытаюсь выполнитьlf
иlsf
,очевидно, что псевдонимы раскрываются при определении функции, а не при ее выполнении, поскольку :
lf
, ошибка-bash: ll: command not found
иlsf
,/usr/bin/ls
используется, а не форма псевдонима, отсутствие выделения цвета и контрольные символы после исполняемого файла.источник