我刚刚修改了~/.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。
答案 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
。