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


9

我的最后一行.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
记录:从技术上讲,别名不会覆盖PATHenvar中的任何值。
can-ned_food

强制性警告:通常,重命名常用命令不是一个好习惯。这可以两种方式咬你。1)如果您在其他系统上工作并按习惯使用命令,则将获得本机命令的意外行为。2)如果其他人使用您的系统,甚至为您提供建议/帮助您解决问题,他们也会得到您定制的意外行为。自定义命令很好,只是不要将它们命名为与现有通用命令相同的名称。

@joe实际上,这里的情况恰恰相反cp的os / x版本缺少nix的选项,因此它的行为不符合预期(除了*那些喜欢的Mac版本的用户除外)
javadba

Answers:


21

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

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

重要的是要认识到别名将不会由子进程解释,例如可以运行系统命令的脚本或交互式编辑器。

如果您执行cp功能,则您的版本将在脚本中运行,尽管不能从其他程序运行:

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

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

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

尽管您可以使它成为稍微有效的硬链接(省略-s),但这将形成符号链接,但这通常需要root权限(sudo ln ...)。PATHbash具有用户权限的情况下,将使用一种启动脚本来创建函数并添加到变量。


1
尽管在CentOS(和AIUI都是RedHat)上,标准配置文件(除非被覆盖)会创建一个别名which别名/usr/bin/which使用从输出的管道输入的输入alias和一个选项来告诉它读取该输入并使用它显示一个别名(如果与之匹配)。命令。参见unix.stackexchange.com/questions/10525/…–
dave_thompson_085

@ dave_thompson_085-有趣的评论:我没有使用过那些发行版。我使用Ubuntu,通过简单地别名which为,我可以获得几乎相同的效果type。然后,其which -a操作类似于外部程序,并添加了别名和函数定义。一般来说,我不会alias which=type,因为我喜欢$(which ProgName)在要强制使用外部程序时使用它,而绕开了任何别名或函数定义。
AFH

1
硬链接无法跨文件系统,因此ln仅当您的主目录与处于同一文件系统时,非符号建议才有效/usr/local/bin。如果您进行更新gcp,它的行为也会很奇怪,因为您的硬链接可能仍会引用旧版本。
没用

@Useless-有效点,这也是为什么我编辑答案以首先建议符号链接的部分原因,尽管我认为权限可能是最重要的考虑因素。至于更新gcp,将取决于更新是通过打开并写入还是通过删除并重新创建来完成。注意,使用绝对或相对源路径创建硬链接并不重要,而符号链接通常需要绝对路径。链接在OS中被广泛使用,并且它们大多是象征性的。
AFH

1
@ can-ned_food-这不像在当前shell中进行设置那样简单:它必须在每个脚本中进行设置,同时还要导入别名。
AFH

13

别名在外壳内部。其他程序将不了解它们。

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

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


2
而且,别名仅在命令中的第一个单词时才扩展。也许这无关紧要。
can-ned_food
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.