Shell

如何在別名命令上使用which

  • July 20, 2019

像大多數使用者一樣,我設置了一堆別名來為常用程序提供一組預設標誌。例如,

alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'

問題是,如果我想用它which來查看我的vim/// etc 的來源grepls別名會妨礙:

$ 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

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