Linux: Hapus jalur redundan dari variabel $ PATH
Linux From Scratch memiliki fungsi ini di / 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"
}
Ini dimaksudkan untuk digunakan dengan fungsi berikut untuk menambahkan ke jalur, sehingga Anda tidak melakukannya secara berlebihan:
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"
}
Penggunaan sederhana adalah hanya memberikan pathremovejalur direktori untuk dihapus - tetapi perlu diingat bahwa itu harus sama persis:
$ pathremove /home/username/anaconda3/bin
Ini akan menghapus setiap instance dari direktori itu dari jalur Anda.
Jika Anda menginginkan direktori di jalur Anda, tetapi tanpa redundansi, Anda bisa menggunakan salah satu fungsi lain, misalnya - untuk kasus khusus Anda:
$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games
Tapi, kecuali keterbacaan menjadi perhatian, pada titik ini Anda lebih baik hanya melakukan:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Akankah hal di atas berhasil di semua cangkang yang diketahui manusia?
Aku akan menganggap di atas untuk bekerja di sh, dashdan bashsetidaknya. Saya akan terkejut mengetahui bahwa itu tidak berhasil csh, fish', orksh`. Saya ragu itu akan bekerja di shell perintah Windows atau Powershell.
Jika Anda memiliki Python, perintah semacam berikut harus melakukan apa yang diminta secara langsung (yaitu, hapus jalur yang berlebihan):
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )
Satu baris (untuk menghindari masalah multiline):
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
Di atas menghapus jalur redundan kemudian. Untuk menghapus jalur redundan sebelumnya, gunakan indeks daftar terbalik dan balikkan lagi:
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )