当我使用source命令运行以重新加载bash终端时,为什么不能使用&&链接命令?

时间:2018-12-07 19:58:35

标签: bash macos command-line terminal

我刚刚修改了~/.bash_profile,使其包含以下别名:

alias ngrep='grep -v grep'

然后我去了一个已经打开的终端会话,并运行以下命令:

source ~/.bash_profile && ps aux | grep mysql | ngrep

输出为:

-bash: ngrep: command not found

但是,我随后立即运行了ngrep,并且运行无误。

我希望更好地了解Terminal。为什么在使用&&购买bash配置文件后,我不能链接刚刚添加的别名?

在运行Mojave的Mac上,并带有标准的终端和bash。

2 个答案:

答案 0 :(得分:5)

别名是在语法解析之前 发生的简单前缀替换。这赋予了它们其他构造所不具备的功能(尽管很少需要或不具备相应的功能)-您可以将某些内容别名为随后被解析为语法的内容-但同时也限制了它们:因为复合命令需要在之前进行解析它可以执行,在执行ngrep命令之前先 解析source命令,因此在需要别名时尚未加载别名。生效。


作为一个简单的演示(感谢a comment by @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,参数为{{ 1}};没有将hi更改为foo的机会,因此,此时定义了别名这一事实对执行没有影响。


您不会在函数中遇到此问题:

echo

...在解析时不需要识别,因此您可以按照问题所示将其单层使用。

答案 1 :(得分:0)

作为一种间接解决方案,请考虑编辑您的匹配模式。例如:

$: ps -fu $LOGNAME
     UID     PID    PPID  TTY        STIME COMMAND
P2759474    6704   10104 pty0     14:26:54 /usr/bin/ps
P2759474   10104    9968 pty0     07:59:11 /usr/bin/bash
P2759474    9968       1 ?        07:59:10 /usr/bin/mintty
$: ps -fu $LOGNAME | grep '/mintty$'
P2759474    9968       1 ?        07:59:10 /usr/bin/mintty

如果您的grep -v grep已经足够明确以排除自身,则不必grep