2017-04-06 57 views
1

我使用fish 2.2.0。 (是的,我知道它已經老了,我無能爲力。)

我想從$ PATH中取消路徑(/usr/local/ferret-6.82/bin)。要做到這一點,我會假設使用sed將工作:

> echo $PATH 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /usr/local/ferret-6.82/bin /opt/intel/bin 

> echo $PATH | sed -e 's:/usr/local/ferret-6.82/bin ::g' 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin 

太棒了!然而...

> set -gx PATH (echo $PATH | sed -e 's:/usr/local/ferret-6.82/bin ::g') 
set: Warning: path component /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin may not be valid in PATH. 
set: No such file or directory 
> echo $PATH 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /usr/local/ferret-6.82/bin /opt/intel/bin 

當然,所有這些目錄都存在。手動設置路徑:

> set -gx PATH /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin 
> echo $PATH 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin 

這裏有什麼問題?爲什麼我的路徑設置使用sed失敗?

回答

3

$ PATH,$ CDPATH和$ MANPATH是特別的魚。 (由於2.2.0,它僅僅是那些特定變量。在此之前,這將適用於任何變量)

它們與每個組件的一個元件導出到時被轉換爲與從通常的冒號分隔的形式列出並從外部程序導入。

你想在這裏做的是既可以使用魚腳本:

if set -l ind (contains -i -- /usr/local/ferret-6.82/bin $PATH) 
    set -e PATH[$ind] 
end 

contains -i將返回0和輸出的第一個參數是,set -e會從列表中刪除該元素的索引。 「 - 」是選項分隔符,在此之後沒有參數將被解釋爲選項。請注意缺失的引號$PATH,這會導致$ PATH的每個組件都作爲單獨的參數傳遞。

或者,因爲魚分裂命令在換行符替換,可以在每行$ PATH操作,與

printf '%s\n' $PATH | sed '\_/usr/local/ferret-6.82/bin_d' 

(注:對於「d」命令,既要躲避分隔符 - 在這種情況下的「_」 - 如果不是「/」,則首先使用)

相關問題