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

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

我的最后一行.bash_profile是:

alias cp=/usr/local/bin/gcp

然而,这被我的条目压制了$PATH

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

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

答案1

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

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

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

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

cp() { /usr/local/bin/gcp "$@"; }

如果您希望cp在任何地方都能工作,请$HOME/bin在列表顶部添加PATH并指向$HOME/bin/cp它:

ln -s /usr/local/bin/gcp $HOME/bin/cp

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

答案2

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

which不是 Bash 内置命令(它是其他一些 shellwhich的内置命令,例如 zsh)。由于没有 Bash 别名中的特权信息,因此which只需查找PATH给定的术语即可。

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

相关内容