2017-06-22 24 views
0

根據我的測試,bash非常滿意~$PATH/usr/bin/which不是。有沒有關於這個的標準(像POSIX)?

實施例:

[STEP 100] # echo $BASH_VERSION 
4.4.12(1)-release 
[STEP 101] # echo $PATH 
/root/bin:/usr/sbin:/usr/bin:/sbin:/bin 
[STEP 102] # /usr/bin/which passh 
/root/bin/passh 
[STEP 103] # type passh 
passh is /root/bin/passh 
[STEP 104] # 
[STEP 105] # PATH='~/bin':/usr/sbin:/usr/bin:/sbin:/bin 
[STEP 106] # echo $PATH 
~/bin:/usr/sbin:/usr/bin:/sbin:/bin 
[STEP 107] # /usr/bin/which passh 
[STEP 108] # hash -r 
[STEP 109] # hash 
hash: hash table empty 
[STEP 110] # type passh 
passh is /root/bin/passh 
[STEP 111] # 

正如我們所看到的,在步驟107中which找不到任何passh以上,但在步驟110中bash仍然可以找到passh後我清除哈希表(hash -r)。

回答

2

您有這部分PATH變量:'~/bin'

這裏~被引述並沒有得到擴大。這可以通過bash內置實用程序來處理,如type,但which是一個外部程序,不會擴展引用~

如果你想~擴大,然後保持引號外面:

PATH=~/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin 

或者使用$HOME

PATH="$HOME/bin":/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin 
+1

@whjm'bash'本身可以解釋PATH'的'值文字波浪線作爲'$ HOME'一條捷徑,但其他程序(如'which')不會。 – chepner

+0

對不起@whjm刪除'hash'將不起作用。讓我編輯它。 – anubhava

+1

沒有必要爲一個標準:你沒有一個目錄,它的名字,從字面上看,是'〜'。 'PATH'對'bash'不是特別的;它是由一個使用'execlp'或'execvp'執行新的程序的任何程序中使用,因此沒有(也不應該)瞭解具體的殼快捷方式。 – chepner

0

發現以下信息在POSIX.1-2008

XBD - 8.3其他環境變量

  • PATH
    此變量應代表路徑的序列的前綴某些功能和實用程序適用於搜索僅由一個文件名已知的可執行文件。前綴應以冒號:)分隔。當非零長度的前綴應用於該文件名時,如果前綴未以斜槓結尾,則應在前綴和文件名之間插入斜槓。零長度前綴是指示當前工作目錄的遺留功能。它顯示爲兩個相鄰結腸字符(::),作爲初始結腸列表的其餘部分前面,或作爲後結腸以下列表的其餘部分。嚴格符合要求的應用程序應使用實際路徑名(例如.)表示PATH中的當前工作目錄。 該列表應從頭到尾進行搜索,將文件名應用於每個前綴,直到找到具有指定名稱和適當執行權限的可執行文件。如果正在搜索的路徑名包含斜槓,則不應執行通過路徑前綴的搜索。如果路徑名以斜槓開頭,則會解析指定的路徑。如果PATH未設置或設置爲空,則路徑搜索是實現定義的。

    由於結腸是這方面的一個分離器,可能在PATH使用目錄名稱不應該包括冒號字符。


而且從Glibc 2.22 DOC:

25.4.2標準環境變量

  • PATH
    路徑是用於搜索文件目錄名的序列。變量PATH持有用於搜索運行程序的路徑。該execlpexecvp功能使用此環境變量,像許多炮彈和在這些職責落實等公用事業。路徑的語法是由冒號分隔的一系列目錄名稱。一個空字符串代替目錄名稱代表當前目錄。
相關問題