.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