Normalmente podemos obtener el ~/.bashrc
archivo fuente usando este comando
source ~/.bashrc
pero si escribo esto en un script de shell y lo ejecuto, no pasa nada. ¿Por qué?
¿Hay alguna forma de hacer esto?
Mi guión:
#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc
También probé .
(punto) en lugar de source
. Mismo resultado.
source ~/.bashrc
en el shell en el que desea cambiar el entorno. No puede cambiarlo desde otro proceso. Tal vez (globalmente) agregar este alias podría ser parte del proceso de instalación de su GUI.Su
.bashrc
generalmente comienza:Como su secuencia de comandos no tiene configurada la PS1 (porque no es interactiva), no restablece la ruta porque se cierra antes. Para demostrarlo, modifique su script:
Esto ahora permitirá que sus scripts funcionen con el nuevo
.bashrc
. Nota: una vez que se cierra el script, el entorno se establecerá en lo que era antes de comenzar el script. Los cambios se reflejarán la próxima vez que se inicie un terminal.fuente
.bashrc
usa una forma más confiable para verificar que el shell sea interactivo./etc/bash.bashrc
Todavía tiene la prueba de PS1.Tratar:
Esto debería recargar ~ / .bashrc, ~ / .bash_aliases, etc.
fuente
source
pero destruye cualquier variable y tal que el usuario haya configurado manualmente, lo que puede o no ser lo que desea.exec bash
, la forma en que entiendo que el comando después seguirá estando en la misma configuración de bash que antes?Quiero complementar la respuesta de ravi :
Este comportamiento es específico de Ubuntu (y probablemente de las distribuciones más derivadas), ya que su
~/.bashrc
archivo predeterminado comienza con un cortocircuito, Ubuntu 18.04, por ejemplo:Eso detendrá la evaluación del archivo si se está ejecutando en un shell no interactivo, que es el caso de su script ya que todos los scripts se ejecutan en un shell no interactivo y, posteriormente, cada archivo
source
heredará esta propiedad.eval
cortar a tajosDescubrí un truco feo para solucionar Ubuntu específicamente, usando en
eval
lugar desource
:Simplemente omite las pocas primeras líneas y evalúa el resto de las demás, de
~/.bashrc
modo que el resto se evalúa y modifica la ejecución actual.Tenga en cuenta que es un número mágico y que podría no funcionar en las versiones de Ubuntu; pero puede ser una buena solución si está creando scripts para sistemas más o menos conocidos.
Una solución más elegante podría implicar el uso de expresiones regulares para apuntar a los bits específicos que detienen la evaluación.
Alternativa de Shebang
Otra alternativa que podría funcionar mejor en algunos escenarios es obligar al script a ejecutarse en un shell interactivo agregando una bandera en el shebang :
Tenga en cuenta algunas cosas:
#!/usr/bin/env bash
formulario, pero de esta manera no puede iniciar el shell con argumentos .-i
tiene sus propias consecuencias, entre ellas, los programas solicitarán la interacción del usuario y esto generalmente no está destinado a los scripts, por ejemplo, la instalación dedeb
paquetes podría detener el script en lasdpkg configure
indicaciones .set -i
yset +i
activar y desactivar la función donde la necesitaba, pero esto no funciona .fuente
Ninguno de los otros métodos funcionó para mí [
source /path/to/file
vs. ./path/to/file
, alias, etc ...], hasta que, gracias a este tutorial , descubrí que usando:#!/usr/bin/env bash
el asuntoen lugar del más simple,
#!/usr/bin/env
permite que los argumentos pasen al intérprete, que creo que es la clave aquí; consulte este documento para obtener más información.En cualquier caso, si los comandos de origen en cualquier forma no funcionan para usted, intente verificar su shebang, ese podría ser el problema :)
fuente