Псевдонимы - это простые замены префиксов, которые выполняются за до синтаксического анализа .Это дает им полномочия, которых нет у других конструкций (хотя это полномочия, которые редко нужны или уместны) - вы можете присвоить псевдоним содержимому, которое впоследствии анализируется как синтаксис, - но это также ограничивает их: поскольку составная команда должна быть проанализирована передэто может быть выполнено, команда ngrep
анализируется до команды source
, поэтому псевдоним еще не загружен в тот момент, когда он должен вступить в силу.
В качестве простой демонстрации (благодаря комментарию @ chepner ):
alias foo=echo; foo hi
foo bye
... будет выдавать:
-bash: foo: command not found
bye
... потому что псевдоним не был на месте, когда была проанализирована первая строка (alias foo=echo; foo hi
), но - это для строки foo bye
.(Псевдоним равен , когда foo hi
равен run , но команда уже разбита на команду foo
с аргументом hi
; остающаяся возможность отсутствуетизменить foo
на echo
, поэтому тот факт, что псевдоним определен в это время, не влияет на выполнение).
У вас не будет этой проблемы с функцией:
# note that you can't run this in a shell that previously had ngrep defined as an alias
# ...unless you unalias it first!
ngrep() { grep -v grep "$@"; }
... не требует распознавания во время разбора, поэтому вы можете использовать его в одну строку, как показано в вопросе.