如何在別名命令上使用which
?
像大多數使用者一樣,我設置了一堆別名來為常用程序提供一組預設標誌。例如,
alias vim='vim -X' alias grep='grep -E' alias ls='ls -G'
問題是,如果我想用它
which
來查看我的vim
/// etc 的來源grep
,ls
別名會妨礙:$ which vim vim: aliased to vim -X
這是有用的輸出,但不是我在這種情況下要尋找的;我知道
vim
是別名,vim -X
但我想知道它vim
來自哪裡。除了暫時取消定義別名以便我可以使用
which
它之外,是否有一種簡單的方法可以which
“解開”別名並在其上執行?**編輯:**這似乎
which
是一個shell-builtin,在不同的shell中具有不同的行為。在 Bash 中,SiegeX 對--skip-alias
標誌的建議有效;但是,我在 Zsh 上。那裡有類似的東西嗎?
which``$SHELL
實際上是一種不好的方式來做這樣的事情,因為它會根據shell 使用的啟動文件(它認為)來猜測你的環境;它不僅有時會猜錯,而且你通常不能告訴它有不同的行為。(例如,在我的 Ubuntu 10.10 上,正如 @SiegeX 所提到的which
那樣不理解。)使用目前的 shell 環境而不是查看您的配置文件,並且可以被告知忽略該環境的某些部分,因此它會向您展示實際會發生什麼發生而不是在重建預設 shell 時會發生什麼。--skip-alias``type
在這種情況下,
type -P
將繞過任何別名或函式:$ type -P vim /usr/bin/vim
您還可以要求它一次一層地剝離所有層,然後向您展示它會發現什麼:
$ type -a vim vim is aliased to `vim -X' vim is /usr/bin/vim
(從評論中對此進行擴展:)
問題
which
在於它通常是一個外部程序而不是內置的 shell,這意味著它看不到您的別名或函式,並且必須嘗試從 shell 的啟動/配置文件中重建它們。(如果它是內置的 shell,因為它在zsh
但顯然不是bash
,它更有可能使用 shell 的環境並做正確的事情。)
type
是一個符合 POSIX 的命令,它需要像內置一樣執行(也就是說,它必須使用呼叫它的 shell 的環境,包括本地別名和函式),所以它通常是內置的。它通常不在
csh
/中找到tcsh
,儘管在大多數現代版本中which
是內置的 shell 並且做正確的事情;有時是內置的what
,有時根本沒有從csh
/查看目前 shell 環境的好方法tcsh
。