我想将 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
问题
有人可以澄清当我在 bash 上
pandoc
输入时将执行 pandoc 和 gsettings 的哪个二进制文件吗?gsettings
命令的输出顺序
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/bin
after/sbin
和 before 的情况/usr/bin
,以及此顺序如何反映在 的输出中type
。
最后,要知道哪一个将被执行,最简单的方法是type
运行-a
:
$ type ls
ls is aliased to `ls --color=tty'
它总是只返回一项,并且这就是您使用该命令时将执行的一项。