Bash

當我們有多個安裝時,將執行哪個二進製文件?

  • June 30, 2020

我想設置 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. pandoc有人可以澄清一下當我在 bash 上鍵入和執行 pandoc 和 gsettings 的哪個二進製文件gsettings
  2. 命令的輸出順序type有什麼意義嗎?

筆記

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

是的,順序很重要:輸出中type的第一個就是將執行的那個。因此,在您的情況下,pandoc將執行別名 ,/usr/bin/pandocgsettings執行/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, 顯示在別名之後(別名總是優先), after/sbin/ls和 before /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'

這總是只返回一項,這就是您使用該命令時將執行的一項。

引用自:https://unix.stackexchange.com/questions/595856