Linux: Loại bỏ các đường dẫn dư thừa khỏi biến $ PATH
Linux From Scratch có chức năng này trong / 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"
}
Điều này được dự định sẽ được sử dụng với các chức năng này để thêm vào đường dẫn, do đó bạn không thực hiện nó một cách dư thừa:
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"
}
Cách sử dụng đơn giản là chỉ cần cung cấp pathremove
đường dẫn thư mục để xóa - nhưng hãy nhớ rằng nó phải khớp chính xác:
$ pathremove /home/username/anaconda3/bin
Điều này sẽ loại bỏ từng phiên bản của thư mục đó khỏi đường dẫn của bạn.
Nếu bạn muốn thư mục trong đường dẫn của mình, nhưng không có dự phòng, bạn chỉ có thể sử dụng một trong các chức năng khác, ví dụ - cho trường hợp cụ thể của bạn:
$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games
Nhưng, trừ khi khả năng đọc là mối quan tâm, tại thời điểm này, bạn nên làm tốt hơn:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Những điều trên sẽ làm việc trong tất cả các vỏ được biết đến với con người?
Tôi sẽ đoán ở trên để làm việc trong sh
, dash
và bash
ít nhất. Tôi sẽ ngạc nhiên khi biết nó không hoạt động csh
, fish', or
ksh`. Tôi nghi ngờ nó sẽ hoạt động trong Windows shell shell hoặc Powershell.
Nếu bạn có Python, loại lệnh sau sẽ thực hiện những gì được yêu cầu trực tiếp (nghĩa là loại bỏ các đường dẫn dư thừa):
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )
Một lớp lót (để vượt qua các vấn đề đa dòng):
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
Ở trên loại bỏ các đường dẫn dư thừa sau này. Để xóa các đường dẫn dự phòng trước đó, hãy sử dụng chỉ mục của danh sách đảo ngược và đảo ngược lại:
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )