$ PATH変数に同じパスを6回定義しました。
うまく動くかどうかをチェックするためにログアウトしていませんでした。
重複を削除するにはどうすればよいですか。
$ PATH変数は次のようになります。
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin
どのように私はそれをちょうどにリセットするでしょう
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
実行するだけです:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
あなたのシステムやユーザーのニーズに合ったものであれば、いつでも.bashrc、bash.bashrc、/ etc/profileのいずれかに恒久的に変更したいのなら、それは現在のセッション用です。
Bashを使用している場合、PATH
変数からディレクトリ/home/wrong/dir/
を削除したい場合は、次のようにすることもできます。
PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`
スクリプトを実行する前にPATH
変数からパスを削除する必要がある場合は、これをスクリプトの先頭に追加します。
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
必要に応じて、リストの先頭に追加し直すことができます。
PATH=/home/user/bin:$PATH
または、リストの最後に次のように追加し直すこともできます。
PATH=$PATH:/home/user/bin
Linux:$ PATH変数から冗長パスを削除
Linux From Scratchにはこれがあります / etc/profileの中の関数
# Functions to help us manage paths. Second argument is the name of the
# path variable to be modified (default: PATH)
pathremove () {
local IFS=':'
local NEWPATH
local DIR
local PATHVARIABLE=${2:-PATH}
for DIR in ${!PATHVARIABLE} ; do
if [ "$DIR" != "$1" ] ; then
NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
fi
done
export $PATHVARIABLE="$NEWPATH"
}
これは、パスに追加するためにこれらの関数と一緒に使用することを目的としているので、冗長にしないでください。
pathprepend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}
pathappend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}
簡単な使い方は、削除するディレクトリパスをpathremove
に指定することです - ただし、それは正確に一致する必要があることに注意してください。
$ pathremove /home/username/anaconda3/bin
これにより、そのディレクトリの各インスタンスがパスから削除されます。
あなたのパスにディレクトリが欲しいが、冗長性がなければ、他の関数の1つを使うことができます。 - あなたの特定の場合のために:
$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games
しかし、読みやすさが問題にならない限り、この時点であなたはただすることをお勧めします。
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
私は上記が少なくともsh
、dash
、およびbash
で動作すると思います。 csh
やfish', or
ksh`ではうまくいかないことを知って驚いたでしょう。私はそれがWindowsコマンドShellかPowershellでうまくいくかどうか疑います。
Pythonをお持ちの場合は、次のようなコマンドで直接求められていることを実行します(つまり、冗長なパスを削除します)。
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )
ワンライナー(複数行の問題を回避するため):
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
上記は後で冗長なパスを削除します。以前の冗長パスを削除するには、逆リストのインデックスを使用して、もう一度逆インデックスを使用します。
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )
これはPATHをクリーンアップする1行のコードです。
/bin/awk
を使用するので、PATHが壊れていても機能します。
export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";}
{sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1;
printf(((NR==1)?"":":")$0)}}')";
重複したパスを削除するだけの場合は、複数のPerl5/binパスで問題が発生したため、しばらく前に書いたスクリプトを使用します。
#!/bin/bash
#
# path-cleanup
#
# This must be run as "source path-cleanup" or ". path-cleanup"
# so the current Shell gets the changes.
pathlist=`echo $PATH | sed 's/:/\n/g' | uniq`
# echo "Starting PATH: $PATH"
# echo "pathlist: $pathlist"
unset PATH
# echo "After unset, PATH: $PATH"
for dir in $pathlist
do
if test -d $dir ; then
if test -z $PATH; then
PATH=$dir
else
PATH=$PATH:$dir
fi
fi
done
export PATH
# echo "After loop, PATH: $PATH"
そして最後にそれを私の〜/ .profileに入れます。私はBASHをほとんど独占的に使用しているので、他のシェルでは試していません。
Bashでは、単純に$ {var/find/replace}を使えます。
PATH=${PATH/%:\/home\/wrong\/dir\//}
またはこの場合(置換ビットが空なので)、
PATH=${PATH%:\/home\/wrong\/dir\/}
私は最初にここに来たが、これをするために パラメータ展開 があるだろうと思ったので他のものに行きました。 sedよりも簡単です。
簡単なコピー&ペーストテンプレートのために、私はこのPerlスニペットを使います:
PATH=`echo $PATH | Perl -pe s:/path/to/be/excluded::`
この方法で代用演算子のためにスラッシュをエスケープする必要はありません。
echo $PATH
だけPATH= # pass new list of entries
$PATH
の値を「編集」するための標準的なツールはありません(すなわち、「まだ存在しない場合にのみフォルダを追加する」または「このフォルダを削除する」)。
次回ログインしたときのパスを確認するには、telnet localhost
(またはtelnet 127.0.0.1
)を使用します。それはそれからあなたのユーザ名とパスワードを尋ねます。
これはあなたに新しいログインシェル(つまり、現在の環境から何も継承しないまったく新しいもの)を提供します。
そこにある$PATH
の値を確認して、正しい値になるまでrcファイルを編集できます。これは、重要なファイルを変更した後にもう一度ログインできるかどうかを確認するのにも役立ちます。
これらの重複したパスをPATH変数にどのように追加しましたか? .
ファイルの1つを編集したはずです。 (あなたの特定のシステム/シェルに応じて.tcshrc
、.bashrc
など)。これを修正する方法は、ファイルを再度編集して重複したパスを削除することです。
あなたがしていないファイルを編集していて、あなたがPATHを対話的に修正したに違いない場合。その場合、変更は「固執」しません。つまり、別のシェルを開いたり、ログアウトして再度ログインした場合、変更は自動的に失われます。
システム全体の設定ファイルもありますが、それらを変更することはまずありません。おそらく、個人のホームディレクトリ内のファイルを変更することになります(一連のパスを確定した後でそれらの変更を永続的にする場合)。
あなたのシェルがBashであると仮定すると、あなたは次のようにパスを設定することができます。
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
しかしレボンが別の答えで言ったように、あなたがシェルを終了するとすぐに変更は消えます。あなたはおそらくPATH
を~/.bash_profile
または~/.bashrc
に設定したいでしょう。