2 votos

La secuencia de comandos en ~/.bashrc funciona cuando se ejecutan manualmente, pero no lo contrario

Esto es bastante extraño.
Así que he desarrollado esta cosa llamada SahibLib y es básicamente una secuencia de comandos que usted origen de las fuentes de un montón de otras secuencias de comandos.

Su árbol de directorios se parece a esto:

/home
    |- /home/myuser
       |- /home/myuser/sahiblib
          |- sahibload <- executed in ~/.bashrc
          |- sahiblib <- executed by sahibload
          |- modules
             |- core.sls <- problem file
             |- example.sls <- problem file

Lo SahibLib se supone que hacer es el origen de la .sls archivos. No es que a pesar de.

Se emite el mensaje correcto ("[el ÉXITO] Gracias y adiós."), pero los archivos no son de origen.

myuser@mypc:~$ slhelp
Invalid command.

Extrañamente, cuando me de la fuente el archivo de forma manual, funciona:

myuser@mypc:~$ . ~/.bashrc
[SUCCESS] Thank you and goodbye.
myuser@mypc:~$ slhelp
SahibLib Core Help
...

Mi pregunta es, ¿por qué no el script correctamente la ejecución de en ~/.bashrc?


Actualización: Escribir algunos comandos de depuración a core.sls, parece que el archivo se ejecuta perfectamente. Se llega al final del archivo y devuelve un estándar de código de salida. Esto hace que el problema sea aún más extraño, porque ahora parece que Bash es simplemente ignorar las definiciones de función directamente. También, si usted necesita ver a core.sls, o cualquiera de los archivos, que están disponibles aquí

5voto

John1024 Puntos 3801

A partir de su enlace, cerca de la parte inferior de la página, veo que esta línea:

echo "/home/myusername/sahiblib/sahibload" >> ~/.bashrc

Esto indica que, cuando ~/.bashrc es ejecutar, ejecutar sahibload, no la fuente. Eso significa que cualquiera de las funciones definidas por sahibload se perderán cuando la ejecución de la sahibload completa y el control se devuelve a ~/.bashrc.

Si desea que las funciones definidas por sahibload a sobrevivir, utilice:

echo ". /home/myusername/sahiblib/sahibload" >> ~/.bashrc

Simple ejemplo

Vamos a considerar en este archivo de prueba:

$ cat loader
#!/bin/sh
hello() { echo Hello; }

Antes de ejecutar el script, no hay ninguna función hello:

$ hello
bash: hello: command not found

Después de ejecutar la secuencia de comandos, todavía no hay función denominada hello:

$ ./loader
$ hello
bash: hello: command not found

En la de arriba, loader se ejecuta de la misma manera que sahibload se ejecuta en ~/.bashrc.

Ahora, vamos a la fuente loader y observar que la definición de hello sobrevive:

$ . ./loader
$ hello
Hello

sahibload necesidades que se obtienen, no se ejecuta, en ~/.bashrc.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: