Aquí hay un código de una línea que limpia la RUTA
- No altera el orden de la RUTA, solo elimina los duplicados
- Trata:y empth PATH con gracia
- No se utilizan caracteres especiales, por lo que no requiere escape
-
Usa
/bin/awk
por lo que funciona incluso cuando PATH está rotoexport PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";} {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1; printf(((NR==1)?"":":")$0)}}')";
Simplemente ejecuta:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
eso sería para la sesión actual, si desea cambiar permanentemente, agréguelo a cualquier .bashrc, bash.bashrc, /etc/profile, lo que sea que se ajuste a su sistema y a las necesidades del usuario.
Nota:Esto es para Linux. Dejaremos esto claro para los nuevos programadores. (` , ') No intente SET =estos.
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"
}
Esto está diseñado para usarse con estas funciones para agregar a la ruta, para que no lo haga de manera 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 a 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, p. - 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 simplemente hagas:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
¿Funcionaría lo anterior en todos los caparazones conocidos por el hombre?
Supongo que lo anterior funciona en sh
, dash
y bash
al menos. Me sorprendería saber 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 debería 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 sola línea (para eludir los problemas de varias líneas):
$ 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 invertida 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)))
" )
Si está utilizando Bash, también puede hacer lo siguiente si, digamos, desea eliminar el directorio /home/wrong/dir/
de tu PATH
variables:
PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`