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:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
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 tajos
Descubrí un truco feo para solucionar Ubuntu específicamente, usando en eval
lugar de source
:
eval "$(cat ~/.bashrc | tail -n +10)"
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 :
#!/bin/bash -i
Tenga en cuenta algunas cosas:
- Es una mejor práctica usar el
#!/usr/bin/env bash
formulario, pero de esta manera no puede iniciar el shell con argumentos .
- El uso de
-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 de deb
paquetes podría detener el script en las dpkg configure
indicaciones .
- Inicialmente intenté usar
set -i
y set +i
activar y desactivar la función donde la necesitaba, pero esto no funciona .