Bash
當我們有多個安裝時,將執行哪個二進製文件?
我想設置 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
問題
pandoc
有人可以澄清一下當我在 bash 上鍵入和執行 pandoc 和 gsettings 的哪個二進製文件gsettings
?- 命令的輸出順序
type
有什麼意義嗎?筆記
$ type type type is a function type () { builtin type -a "$@" } type is a shell builtin
是的,順序很重要:輸出中
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
, 顯示在別名之後(別名總是優先), 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/bin
after/sbin
和 before/usr/bin
的順序,以及此順序如何反映在 的輸出中type
。最後,知道哪個將被執行的最簡單方法是不
type
執行-a
:$ type ls ls is aliased to `ls --color=tty'
這總是只返回一項,這就是您使用該命令時將執行的一項。