Normalmente podemos obtener el ~/.bashrcarchivo 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 ~/.bashrcen 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
.bashrcgeneralmente 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
.bashrcusa una forma más confiable para verificar que el shell sea interactivo./etc/bash.bashrcTodavía tiene la prueba de PS1.Tratar:
Esto debería recargar ~ / .bashrc, ~ / .bash_aliases, etc.
fuente
sourcepero 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
~/.bashrcarchivo 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
sourceheredará esta propiedad.evalcortar a tajosDescubrí un truco feo para solucionar Ubuntu específicamente, usando en
evallugar desource:Simplemente omite las pocas primeras líneas y evalúa el resto de las demás, de
~/.bashrcmodo 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 bashformulario, pero de esta manera no puede iniciar el shell con argumentos .-itiene 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 dedebpaquetes podría detener el script en lasdpkg configureindicaciones .set -iyset +iactivar 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/filevs. ./path/to/file, alias, etc ...], hasta que, gracias a este tutorial , descubrí que usando:#!/usr/bin/env bashel asuntoen lugar del más simple,
#!/usr/bin/envpermite 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