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.
别名是在解析语法之前发生的简单前缀替换.这给了他们其他构造所没有的权力(尽管很少需要或适当的权力) - 你可以将某些东西别名化为随后被解析为语法的内容 - 但它也会限制它们:因为复合命令需要先解析它可以被执行,该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;有改变没有剩余的机会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 "$@"; }
Run Code Online (Sandbox Code Playgroud)
...不需要在分析时识别,因此您可以在问题中显示的单行中使用它.