Estoy tratando de compilar wxWidgets usando MingW, y tengo cygwin en mi camino, lo que parece estar en conflicto. Por lo tanto, me gustaría eliminar /d/Programme/cygwin/bin
de la variable PATH y me pregunto si hay alguna forma elegante de hacerlo.
El enfoque ingenuo sería hacer eco en un archivo, eliminarlo manualmente y obtenerlo, pero apuesto a que hay un mejor enfoque para esto.
bash
shell
environment-variables
path
Devolus
fuente
fuente
Respuestas:
No hay herramientas estándar para "editar" el valor de $ PATH (es decir, "agregar carpeta solo cuando aún no existe" o "eliminar esta carpeta"). Simplemente ejecutas:
eso sería para la sesión actual, si desea cambiar permanentemente, agréguelo a cualquier .bashrc, bash.bashrc, / etc / profile, lo que se ajuste a las necesidades de su sistema y usuario. Sin embargo, si está utilizando BASH, también puede hacer lo siguiente si, por ejemplo, desea eliminar el directorio
/home/wrong/dir/
de su variable PATH, suponiendo que esté al final:Entonces en tu caso puedes usar
fuente
/
con algo como|
:PATH=$(echo "$PATH" | sed -e 's|:/d/Programme/cygwin/bin$||')
para evitar que se escapen.En bash:
Si no utiliza una variable intermedia, debe proteger los
/
caracteres del directorio para eliminarlos de modo que no se traten como el final del texto de búsqueda.La primera y la tercera línea están allí para organizar cada componente de la ruta de búsqueda para que esté rodeado
:
, para evitar una carcasa especial del primer y último componente. La segunda línea elimina el componente especificado.fuente
Después de considerar otras opciones presentadas aquí, y no entender completamente cómo funcionaban algunas de ellas, desarrollé mi propia
path_remove
función, que agregué a mi.bashrc
:Esto terminó bastante cerca de la solución de Gilles, pero concluyó como una función bash que podría usarse fácilmente en la línea de comando.
Tiene las ventajas de que, como función bash, funciona como un programa sin necesidad de ser un programa en la ruta, y no requiere ningún programa externo para ejecutarse, solo la manipulación de cadenas bash.
Parece bastante robusto, en particular no se convierte
somepath:mypath/mysubpath
ensomepath/mysubpath
: si ejecutapath_remove mypath
, que era un problema que tuve con mipath_remove
función anterior .Puede encontrar una excelente explicación de cómo funciona la manipulación de cadenas de bash en la Guía avanzada de secuencias de comandos Bash .
fuente
Entonces, combinando las respuestas de @gilles y @ bruno-a (y un par de otros trucos de sed) se me ocurrió este one-liner, que eliminará (cada) REMOVE_PART de PATH, independientemente de si ocurre al principio, medio o final de la RUTA
Es un poco difícil de manejar, pero es bueno poder hacerlo de un solo golpe. El
;
se utiliza para unir los dos comandos sed separados:s@:$REMOVE_PART:@:@g
(que reemplaza:$REMOVE_PART:
con una sola:
)s@^:\(.*\):\$@\1@
(que elimina los dos puntos iniciales y finales que agregamos con el comando echo)Y a lo largo de líneas similares, acabo de llegar a esta línea para agregar un ADD_PART a la RUTA, solo si la RUTA aún no lo contiene
Cambie la última parte a
echo "$PATH:$ADD_PART"
si desea agregar ADD_PART al final de PATH en lugar de al inicio....
... o para hacer esto aún más fácil, cree un script llamado
remove_path_part
con el contenidoy un script llamado
prepend_path_part
con el contenidoy un script llamado
append_path_part
con el contenidohacerlos todos ejecutables y luego llamarlos como:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Genial, incluso si lo digo yo mismo :-)
fuente
Mucho más simple un revestimiento.
fuente
Es un ejercicio interesante escribir una función bash para eliminar un directorio de una variable de ruta.
Estas son algunas funciones que uso en mis archivos .bash * para agregar / anteponer directorios a las rutas. Tienen la virtud de eliminar entradas duplicadas, si las hay, y funcionan con cualquier tipo de variable de ruta separada por dos puntos (PATH, MANPATH, INFOPATH, ...). la función remove_from elimina el directorio.
fuente
A continuación se muestra el código revisado de la solución de Greg Tarsa. Aquí solo se usan los comandos de bash build-in. Por lo tanto, ahorrará muchas llamadas al sistema fork ().
fuente
Para completar / mejorar la respuesta aceptada de Tushar, puede:
-e
opción, según la página de manual de sed : "Si no se da la opción -e, --expression, -f o --file, el primer argumento sin opción se toma como el script sed para interpretar".g
bandera (global) para eliminar todas las ocurrenciasAl final, da algo como esto:
fuente
Las respuestas actuales no resuelven mi problema similar, ya que necesito eliminar varias rutas. Todas estas rutas son subdirectorios de un único directorio. En ese caso, este one-liner funciona para mí: (supongamos que el patrón es
cygwin
, es decir, eliminar todas las rutas que contienecygwin
)fuente