2016-09-28 13 views
1

を使用して、私のPATH環境変数から特定の変数を削除することができますがUSR/binと、次のPATHどのように私は入力変数を考えると、魚のシェル

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

は、どのように私は(魚のシェルに)与えられた関数を書くことができると言います文字列/入力はPATH変数からそのパスを削除できますか?私はでこれを書くために良いだろうな

deleteFromPath usr/bin 

として小さな関数を書いて検討していた(例えば、変数のすべての出現箇所を削除1対)最初の発生を削除します>理想的には1

- 魚のシェルではなくPerl/python/ruby​​のようなスクリプト言語?

+0

POSIXシェルではなく、perl/python/ruby​​にジャンプする理由はありますか? –

+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の実装にかなり邪魔なものです。魚は実際にスクリプトのために作られていません。これは非常に対話的なシェルです。 –

+0

@CharlesDuffy: 'fish'は' POSIX'部分文字列除去技術をサポートしていませんか? – Inian

答えて

4

これは魚に行うのはかなり簡単です。

set -eを使用すると、set -e PATH[2]のように、変数全体だけでなくリストから要素を削除して、2番目の要素を削除することができます(魚数リストインデックスは1からカウントされます)。

contains -iとすると、要素のインデックスを見つけることができます。

set -e PATH[(contains -i $argv $PATH)]に電話してください。固定いくつかのエラー処理とedgecasesで

は、this'dあなたと、 deleteFromPath /usr/binをコールする必要があると思いますので、これは、 文字列をパスを比較すること

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 

ノートのように見える先頭の「/」 。それ以外の場合、コンポーネントが見つかりません。

+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

明確にする - これは間違いなく大きな答えではなく、魚に固有の受け入れられた回答*は受け入れられ、私のupvoteを持っています。一方、AFAICTには何も*間違っているわけではないので、私はその場所に置いておきます(そして実際に*が*であるならば、裸のdownvoteとは対照的に説明を感謝します*単に冗長で非効率的ではない)。 –

関連する問題