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

Mat*_*nea 0 macos bash terminal command-line

我刚修改~/.bash_profile为包含以下别名:

alias ngrep='grep -v grep'
Run Code Online (Sandbox Code Playgroud)

然后我去了一个已经打开的终端会话并执行以下操作:

source ~/.bash_profile && ps aux | grep mysql | ngrep
Run Code Online (Sandbox Code Playgroud)

输出是:

-bash: ngrep: command not found
Run Code Online (Sandbox Code Playgroud)

然而,我立即跑了ngrep,它运行没有错误.

我想更好地了解终端.为什么我不能在使用bash配置文件后添加我刚刚添加的别名&&

在运行Mojave的Mac上,使用标准终端和bash.

Cha*_*ffy 5

别名是解析语法之前发生的简单前缀替换.这给了他们其他构造所没有的权力(尽管很少需要或适当的权力) - 你可以将某些东西别名化为随后被解析为语法的内容 - 但它也会限制它们:因为复合命令需要先解析它可以被执行,该ngrep指令被解析之前source执行命令,所以别名还没有加载在该时间点时,将需要生效.


作为一个简单的演示(感谢@chepner的评论):

alias foo=echo; foo hi
foo bye
Run Code Online (Sandbox Code Playgroud)

......会发出:

-bash: foo: command not found
bye
Run Code Online (Sandbox Code Playgroud)

...因为在alias foo=echo; foo hi解析第一行(\n)时别名不存在,但该行就位foo bye.(别名在地方,当foo hi运行,但该命令已经被拆分到命令foo的说法hi;有改变没有剩余的机会fooecho,以便别名此时确定的事实,对执行没有影响) .


你不会遇到这个函数的问题:

# 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 "$@"; }
Run Code Online (Sandbox Code Playgroud)

...不需要在分析时识别,因此您可以在问题中显示的单行中使用它.