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
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
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
.