Linux: eliminar rutas redundantes de la variable $ PATH
Linux From Scratch tiene esta función en / 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"
}
Está destinado a ser utilizado con estas funciones para agregar a la ruta, para que no lo haga de forma redundante:
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"
}
El uso simple es simplemente dar pathremove
la ruta del directorio para eliminar, pero tenga en cuenta que tiene que coincidir exactamente:
$ pathremove /home/username/anaconda3/bin
Esto eliminará cada instancia de ese directorio de su ruta.
Si desea el directorio en su ruta, pero sin las redundancias, puede usar una de las otras funciones, por ejemplo, para su caso específico:
$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games
Pero, a menos que la legibilidad sea la preocupación, en este punto es mejor que solo haga lo siguiente:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
¿Funcionaría lo anterior en todos los depósitos conocidos por el hombre?
Yo presumiría lo anterior para el trabajo en sh
, dash
y bash
por lo menos. Me sorprendería aprender que no funciona en csh
, fish', or
ksh`. Dudo que funcione en el shell de comandos de Windows o Powershell.
Si tiene Python, el siguiente tipo de comando debe hacer lo que se le pide directamente (es decir, eliminar rutas redundantes):
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )
Una línea (para evitar problemas multilínea):
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
Lo anterior elimina las rutas redundantes posteriores. Para eliminar rutas redundantes anteriores, use el índice de una lista inversa y vuelva a invertirlo:
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )