PATH(.cshrc)で重複エントリを防止する

PATH(.cshrc)で重複エントリを防止する

.cshrcファイルのパス変数にディレクトリを追加する必要があり、そのエントリがパス変数の既存のディレクトリと重複していないことを確認したいと思います。これに適したコマンドを提案できる人はいますか?私のコンピュータのパスは:スペースで区切られていません。

答え1

Linuxでは、次のことがcshできtcshます。

set -f path=("/new/entry" $path:q)

csh,tcshそしてzsh,$path特に大量に変数$PATH スカラー環境変数は、配列の要素がコロン文字に変数を分割して$path構成されるためです。修正や$PATHその他の変数に自動的に反映されます。$path$PATH

-f上記は最初の項目だけを保持します。引用されて単語の分割を防ぐ$path:q要素です。$pathしたがって、上記の構文は、/new/entryすでに存在する場合はそれを追加するか、前に移動します。

なぜ使用するのですかcsh


注:上記の引用符が必要です。あるいは、より正確には、/new/entryすべての文字を何らかの方法で参照する必要があります。

set -f path=('/new/'\e"ntry" $path:q)

大丈夫です。

set -f path=(/'new/entry' $path:q)

いいえ。ただし、いつでも次の2つの手順で実行できます。

set path=(/new/entry $path:q)
set -f path=($path:q)

(遠くから過ごしたい理由の一つcsh

答え2

Stephenの答えに加えてこれを追加しています。 $ PATHから重複を削除する方法

私はあなたが持っていると仮定します

  • 以前のディレクトリに残っている必要があります。
  • その他のディレクトリの場合、順序は重要ではありません(たとえば、上記のディレクトリの後ろに配置します)。

だから:

重複項目をキャンセルするには:

UNIQUE_LIST=$( echo "$PATH" | tr ':' '\n' | sort | uniq)

# then we place in front those from UNIQUELIST that match an ordered list
# note that that way, those who didn't have "/sbin" still won't have it, but if they did
# it will be at the right place in the list
shouldbefirst="/bin /sbin /usr/bin" # complete or re-order as needed on your system...
for dir in $shouldbefirst
do
   if ( echo "$UNIQUE_LIST" | grep "$dir" >/dev/null 2>/dev/null)
   then #we have this dir in UNIQUE_LIST
      NEWLIST="${NEWLIST}:${dir}"
      UNIQUE_LIST="$( echo "$UNIQUE_LIST" | grep -v "^$dir\$")"  #we treated that one, take it out of the original list
   fi
done

# then put the remaining of UNIQUE_LIST in the order you want (here, alphabetically)
for dir in $UNIQUE_LIST
do 
   NEWLIST="${NEWLIST}:${dir}"
   UNIQUE_LIST="$( echo "$UNIQUE_LIST" | grep -v "^$dir\$")"  #we treated that one, take it out of the original list
done

 # get rid of possible first ":" (as NEWLIST starts empty)
 NEWLIST="$(echo "$NEWLIST" | sed -e 's/^://')"

 # and then : (I test by placing "echo" in front, get rid of "echo" if it looks fine)
 echo PATH="$NEWLIST"

(今はテストできません)

注:提案を追加します。 「.」は SHOULDBEFIRST ディレクトリの後に「上昇」するので、PATH から削除してください。 (「.」は常に避けてください。使用する場合は常に最後に配置する必要があります。/bin、/usr/binなどのコマンドを簡単にバイパスする方法はありません。)

答え3

私は次にあなたが望む効果を得ることができると思います。

if ( $PATH =~ */some/path* ) then
    set PATH = ($PATH:/some/path)
endif

注:私はより多くのbashを使用しているので、小さな間違いがあれば教えてください。
テストすると、csh

関連情報