2016-09-28 73 views
1

刪除我的PATH環境變量特定變量給定一個輸入變量說usr/bin下以下路徑我如何使用魚貝

echo $PATH 
/usr/local/bin /usr/bin /bin /usr/sbin /sbin /usr/local/sbin /Developer/bin 

我該怎麼寫(魚外殼)給定一個函數字符串/輸入可以從我的PATH變量中刪除該路徑? - >理想的情況是刪除第一次出現(VS一個刪除此類變量的所有實例)

我正在考慮寫一個小功能,如

deleteFromPath usr/bin 

它會更好在寫這篇腳本語言像Perl/python/ruby​​而不是魚殼?

for x in $list 
    if [ $x = $argv ] 
     //delete element x from list -> How? 
    end 
end 
+0

是否有一個原因,你跳轉到perl/python/ruby​​而不是,比如說,一個POSIX shell? –

+0

'IFS =:read -r -a path_entries <<<「$ PATH」;爲「$ {!path_entries [@]}」中的idx;爲arg做; do [[$ {path_entries [$ idx]} =「$ arg」]] && unset path_entries [$ idx];完成;完成; printf -v PATH'%s:'「$ {path_entries [@]}」; PATH = $ {PATH%':'}'讓我覺得它是一個相當理智的bash實現,對正確性持謹慎態度。魚確實不是爲腳本編寫的;它是一個* interactive * shell。 –

+0

@CharlesDuffy:'fish'不支持'POSIX'子串刪除技術? – Inian

回答

4

這是相當容易的魚做的。

使用set -e,您不僅可以擦除整個變量,還可以清除列表中的元素,例如set -e PATH[2]以刪除第二個元素(魚的計數列表索引從1開始)。

隨着contains -i,你可以找到一個元素所在的索引。

所以你想打電話給set -e PATH[(contains -i $argv $PATH)]

隨着一些錯誤處理和edgecases固定,this'd樣子

function deleteFromPath 
    # This only uses the first argument 
    # if you want more, use a for-loop 
    # Or you might want to error `if set -q argv[2]` 
    # The "--" here is to protect from arguments or $PATH components that start with "-" 
    set -l index (contains -i -- $argv[1] $PATH) 
    # If the contains call fails, it returns nothing, so $index will have no elements 
    # (all variables in fish are lists) 
    if set -q index[1] 
     set -e PATH[$index] 
    else 
     return 1 
    end 
    end 

注意,這比較路徑,所以你需要調用deleteFromPath /usr/bin,與領先的「/」 。否則它不會找到組件。

+0

謝謝,這是超級信息。 –

-1

我們可以調用bash。 :)

function removePathElements 
    set PATH (bash -c 'IFS=: read -r -a path_entries <<<"$PATH"; for idx in "${!path_entries[@]}"; do for arg; do [[ ${path_entries[$idx]} = "$arg" ]] && unset path_entries[$idx]; done; done; printf "%s\n" "${path_entries[@]}"' _ $argv) 
end 

需要明確的是,嵌入式的bash代碼在這裏是:

IFS=: read -r -a path_entries <<<"$PATH" 
for idx in "${!path_entries[@]}"; do 
    for arg; do 
    [[ ${path_entries[$idx]} = "$arg" ]] && unset path_entries[$idx] 
    done 
done 
printf "%s\n" "${path_entries[@]}" 
+0

要清楚 - 這絕對不是一個很好的答案,並且魚原生接受的答案*值得*被接受並有我的讚賞。另一方面,AFAICT對此沒有任何錯誤*,這就是爲什麼我要離開它(並且會讚賞一個解釋,而不是一個純粹的downvote,如果實際上*是尊重它是不正確,而不僅僅是冗長和低效)。 –