当我们有多个安装时,将运行哪个二进制文件?

当我们有多个安装时,将运行哪个二进制文件?

我想将 gsettings 设置为/usr/bin/gsettings所以我创建了一个别名。但我不确定这是否有效:

$ type gsettings
gsettings is aliased to `/usr/bin/gsettings'
gsettings is /home/linuxbrew/.linuxbrew/bin/gsettings
gsettings is /usr/bin/gsettings

$ which gsettings
/home/linuxbrew/.linuxbrew/bin/gsettings

还有另一个例子:

$ type pandoc
pandoc is aliased to `/usr/bin/pandoc'
pandoc is /home/linuxbrew/.linuxbrew/bin/pandoc
pandoc is /usr/bin/pandoc
pandoc is /home/nikhil/.cabal/bin/pandoc

$ which pandoc
/home/linuxbrew/.linuxbrew/bin/pandoc

问题

  1. 有人可以澄清当我在 bash 上pandoc输入时将执行 pandoc 和 gsettings 的哪个二进制文件吗?gsettings

  2. 命令的输出顺序type有什么意义吗?

笔记

$ type type
type is a function
type () 
{ 
    builtin type -a "$@"
}
type is a shell builtin

答案1

是的,顺序很重要:输出中第一个的type就是将被执行的那个。因此,在您的情况下,pandoc将运行别名 ,/usr/bin/pandoc并且gsettings将运行/usr/bin/gsettings

我实际上找不到记录此行为的位置,其中指出 的第一个结果type -a是将要执行的结果,但如果取消设置然后重置别名,您可以看到它的实际效果,例如:

$ type -a ls
ls is aliased to `ls --color=tty'
ls is /sbin/ls
ls is /usr/bin/ls

$ unalias ls
$ type -a ls
ls is /sbin/ls
ls is /usr/bin/ls

$ alias ls='ls --color=tty'
$ type -a ls
ls is aliased to `ls --color=tty'
ls is /sbin/ls
ls is /usr/bin/ls

如您所见,重新添加别名后会回到开头。相比于:

$ touch ~/bin/ls; chmod 755 ~/bin/ls
$ type -a ls
ls is aliased to `ls --color=tty'
ls is /sbin/ls
ls is /home/terdon/bin/ls
ls is /usr/bin/ls

我添加的新假命令~/bin/ls,显示在别名之后(别名始终优先)、之后/sbin/ls和之前/usr/bin/ls。这正是执行的顺序,您可以通过检查 my 中的目录顺序看到$PATH

$ echo "$PATH"
/sbin:/usr/sbin:/home/terdon/bin:/usr/local/bin:/usr/local/sbin:/usr/bin

请注意/home/terdon/binafter/sbin和 before 的情况/usr/bin,以及此顺序如何反映在 的输出中type

最后,要知道哪一个将被执行,最简单的方法是type运行-a

$ type ls
ls is aliased to `ls --color=tty'

它总是只返回一项,并且这就是您使用该命令时将执行的一项。

相关内容