别名不会“覆盖” PATH 条目?

Wes*_*cts 9 bash alias bash-alias

我的最后一行.bash_profile是:

alias cp=/usr/local/bin/gcp
Run Code Online (Sandbox Code Playgroud)

但是,这被 my 中的条目压扁了$PATH

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'
Run Code Online (Sandbox Code Playgroud)

我原以为别名会覆盖PATH.. ?

AFH*_*AFH 21

which命令只返回可执行文件:它对别名一无所知,因为它是一个外部程序,并且没有将别名信息传递给子进程的机制。

如果您输入命令,type -a cp您将看到所有可能的解释,按优先顺序排列。这包括任何别名,因为它type是一个bash内部命令。

重要的是要意识到别名不会被子进程解释,例如脚本或具有运行系统命令选项的交互式编辑器。

如果您创建cp一个函数,那么您的版本将在脚本中运行,但不会在其他程序中运行:

cp() { /usr/local/bin/gcp "$@"; }
Run Code Online (Sandbox Code Playgroud)

如果您希望在cp任何地方工作,请$HOME/binPATH列表的开头添加并指向$HOME/bin/cp它:

ln -s /usr/local/bin/gcp $HOME/bin/cp
Run Code Online (Sandbox Code Playgroud)

这将创建一个符号链接,尽管您可以将其设置为更高效的硬链接(省略-s),但这通常需要 root 权限(sudo ln ...)。创建函数并添加到PATH变量将在bash具有用户权限的启动脚本之一中完成。


8bi*_*ree 14

别名是 shell 内部的。其他程序不会知道它们。

which不是 Bash 内置函数(它是其他一些 shell 中的内置函数,例如 zsh)。由于which在 Bash 的别名中没有特权信息,which只需查看PATH给定的术语。

type,另一方面Bash 内置,因此它可以报告别名。

  • 而且,只有在命令中的第一个单词时,别名才会被扩展。也许这无关紧要。 (2认同)