¿Cómo hacer que las funciones creadas en un script bash persistan como las de .bashrc?

Mi .bashrc se estaba volviendo un poco largo, así que decidí dividirlo en files más pequeños según el tema y luego llamar a estos files desde .bashrc como tal

#my long .bashrc file bash .topic1rc bash .topic2rc 

pero, dentro de uno de estos sub-scripts, había creado una function bash. Lamentablemente ya no está disponible para mí, ya que era antes de que rompiera todo en pedazos. ¿Cómo se rompe mi file .bashrc en fragments, pero conservo el acceso a las variables y funciones que creo?

Si entiendo tu pregunta correctamente, necesitas source o . tus files Por ejemplo, dentro de su .bashrc y cuidando el order (solo usted lo sabe):

 source .topic1rc source .topic2rc 

source se puede acortar a . en la command-line para facilitar su uso: es exactamente el mismo command. El efecto de la source es alinear efectivamente la secuencia de commands que se llama.

Lo que estás haciendo no funciona porque cada bash .topic1rc invoca un nuevo shell bash como un process hijo, y no hay forma de comunicar el entorno, las variables del shell o las funciones al process principal, el intérprete de commands bash que te interesa en.

Lo que quieres hacer es usar el . command (también disponible como la source más detallada – cualquiera hace lo mismo). Esto lee el script dado en el shell actual en lugar de en un nuevo shell. Asi que:

 #my long .bashrc file . ~/.topic1rc . ~/.topic2rc 

(Probablemente funciona bien para casi todos los usos para omitir la ruta, ya que el ~/.bashrc principal generalmente se ejecuta cuando inicias session y tu directory de inicio es tu directory de trabajo inicial, pero es mucho mejor práctica deletrearlo).

Como otros han explicado, estás ejecutando esos scripts en un nuevo shell que muere después de que se hayan ejecutado. Necesita get sus files con cualquiera

 . .topic1rc 

o

 source .topic1rc 

También puede crear una solución ligeramente más avanzada que no requiera que edite su .bashrc si desea agregar más fragments en el futuro.

Puede poner todos sus files de configuration en un directory, digamos ~/.bash.d , y luego tener este como el único contenido de su file .bashrc :

 if [[ -d ~/.bash.d ]] then for conf_file in ~/.bash.d/* do if [[ -f $conf_file ]] then source "$conf_file" fi done fi 

De esta forma, todos los files de configuration de bash en .bash.d se obtienen de fonts y puede controlar el order en el que esto sucede, ya que se obtendrán por order alfabético del nombre del file.

Tenga en count que cuando usa la source o . commands, por defecto en bash, el argumento del file se searchá en $PATH less que contenga un / carácter. Quieres o bien

 source ./.topic1rc 

o

 shopt -u sourcepath source .topic1rc