web-dev-qa-db-fra.com

Le script dans ~ / .bashrc fonctionne lorsqu'il est exécuté manuellement, mais pas autrement

C'est assez étrange.
J'ai donc développé cette chose appelée SahibLib et c'est essentiellement un script que vous sourcez qui source un tas d'autres scripts.

Son arborescence de répertoires ressemble à ceci:

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

Ce que SahibLib est censé faire est de générer le .sls des dossiers. Mais cela ne fait pas ça.

Il affiche le message correct ("[SUCCÈS] Merci et au revoir."), Mais les fichiers réels ne sont pas fournis.

myuser@mypc:~$ slhelp
Invalid command.

Étrangement, lorsque je source le fichier manuellement, cela fonctionne:

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

Ma question est, pourquoi le script ne s'exécute-t-il pas correctement dans ~/.bashrc ?


Mise à jour : écriture de certaines commandes de débogage dans core.sls, il semble que le fichier exécute parfaitement. Il arrive à la fin du fichier et renvoie un code de sortie standard. Cela rend le problème même plus étrange, car maintenant il semble que Bash ignore simplement les définitions de fonction. De plus, si vous avez besoin de voir core.sls, ou l'un des fichiers, ils sont disponibles ici

2
InitializeSahib

De votre lien , près du bas de cette page, je vois cette ligne:

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

Cela indique que, lorsque ~/.bashrc est exécuté, il exécutera sahibload, ne le source pas . Cela signifie que toutes les fonctions définies par sahibload seront perdues lorsque l'exécution de sahibload se terminera et que le contrôle sera retourné à ~/.bashrc.

Si vous voulez que les fonctions définies par sahibload survivent, utilisez:

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

Exemple plus simple

Considérons ce fichier de test:

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

Avant d'exécuter le script, il n'y a pas de fonction hello:

$ hello
bash: hello: command not found

Après avoir exécuté le script, il n'y a toujours pas de fonction nommée hello:

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

Dans ce qui précède, loader est exécuté de la même manière que sahibload est exécuté dans ~/.bashrc.

Maintenant, recherchons loader et observons que la définition de hello survit:

$ . ./loader
$ hello
Hello

sahibload doit être originaire, non exécuté, dans ~/.bashrc.

5
John1024