Je développe un script qui configurera et installera un environnement ubuntu-desktop. L’une des modifications apportées consiste à ajouter des fonctions et d’autres éléments au fichier ~/.bashrc
. Plus tard dans le script, j'ai besoin d'appeler l'une des fonctions ajoutées à ~/.bashrc
mais j'obtiens l'erreur command not found
. Voici un exemple de script:
# t.sh
#!/bin/bash
text='test-func() { echo It works!; }'
echo "$text" >> ~/.bashrc
source ~/.bashrc
test-func
echo checkpoint
Sortie:
./t.sh: line 10: test-func: command not found
checkpoint
J'ai supposé que l'approvisionnement ~/.bashrc
mettrait à jour le shell, ce qui me permettrait d'appeler test-func
, mais ce n'est pas le cas. En cherchant sur Google, j'ai trouvé exec bash
pour remplacer source ~/.bashrc
.
Nouvelle sortie:
./t.sh: line 10: test-func: command not found
D'après ce que j'ai compris de exec
, cela crée simplement un nouveau shell qui coupe le script; donc "checkpoint" n'est jamais imprimé.
Comment puis-je mettre à jour ~/.bashrc
et exécuter les mises à jour dans le même script?
Toute aide est très appréciée.
En fait, votre .bashrc
est obtenu. Cependant, .bashrc
est destiné à être lu par des shells interactifs. Un shell qui exécute un script n'est pas interactif.
Dans Ubuntu, .bashrc
vérifie que le fournisseur l’achat est interactif et sinon, il arrête l’exécution. Vous devriez trouver cette ligne vers le début:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Cela provoque votre script pour arrêter la recherche du fichier avant de lire votre fonction.
Vous pouvez simplement attacher votre fonction à un autre fichier que .bashrc
et cela devrait fonctionner correctement. Si vous insistez pour utiliser .bashrc
, vous pouvez simplement définir la variable PS1
sur une valeur factice dans votre script avant de rechercher le code .bashrc
.