我正在運行 Win10,安裝了 Cygwin、適用于 Windows 的 Git 和 Ubuntu WSL。
在 DOS 和 Powershell 中運行這些命令會回傳以下結果:
# DOS
C:\>where grep
C:\cygwin64\bin\grep.exe
C:\Program Files\Git\usr\bin\grep.exe
# DOS
C:\>which grep
/usr/bin/grep
# Powershell
C:\> gcm grep*
CommandType Name Version Source
----------- ---- ------- ------
Application grep.exe 0.0.0.0 C:\cygwin64\bin\grep.exe
Application grep.exe 0.0.0.0 C:\Program Files\Git\usr\bin\grep.exe
現在當我運行它時,上面的哪一個實際運行?
# DOS / Powershell
C:\>grep ... ---> ?
它是按照它們在此處出現的順序運行,還是在 PATH 環境變數中列出?還是另一個訂單(哪一個)?
uj5u.com熱心網友回復:
它是按照它們在此處出現的順序運行,還是在 PATH 環境變數中列出?還是另一個訂單(哪一個)?
是的,在您的呼叫結果中列出其路徑的第一個grep可執行檔案是在您提交時將被呼叫的可執行檔案,即僅僅是檔案名,作為命令。
但是,請注意,您應該呼叫gcm grep,而不是gcm grep*,在其中您只會收到一個結果,因為Get-Command(其內置別名是gcm),當給定文字名稱(而不是通配符運算式)時,僅回傳有效形式/ 默認情況下該命令的路徑,就像 Unixwhich實用程式一樣。
如果您想知道給定名稱的所有形式/路徑,即分別為 via和,則兩者都Get-Command需要which選擇加入,在這種情況下,它們按優先級降序排列,即首先列印有效的形式。-All-a
where.exe相比之下,總是按優先級降序列印所有路徑。
在外部程式中 - 這是唯一考慮的命令形式which-where.exe它是PATH環境變數中列出的目錄的順序決定優先級:具有給定名稱的可執行檔案在列出的目錄中按順序查找,第一個發現是有效的。
在 Windows 上,如果沒有給出檔案擴展名,則將PATHEXT依次應用變數中列出的擴展名來查找完整的檔案名,grep例如grep.exefind 。
Get-Command默認情況下,在考慮外部程式之前,還會以別名、函式、cmdlet 以及腳本檔案的形式另外查找特定于 PowerShell 的命令形式。.ps1您可以使用 限制對外部程式的查找-Type Application,但請注意,在呼叫時您可能必須包含檔案擴展名,以繞過另一個優先的命令形式。
例如,where將呼叫cmdlet(其內置別名之一是),而將呼叫外部程式Where-Object wherewhere.exe. 在類 Unix 平臺上,外部程式通常沒有擴展,需要做更多的作業;where例如,要在不意外呼叫 cmdlet 的情況下呼叫假設程式Where-Object,您必須使用& (Get-Command -Type Application where)
請注意,原則上這同樣適用于cmd.exe與 POSIX 兼容的 shell:它們也有可以隱藏同名外部程式的內部dir命令(例如incmd.exe和printfin Bash);在 中cmd.exe,您可以再次使用可執行檔案的檔案擴展名來確保目標外部程式;例如,在 POSIX 兼容的 shell 中,您可以呼叫 via $(which printf)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478630.html
上一篇:PowerShell變數值不同
