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コマンドシェルまたは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)))
" )