web-dev-qa-db-fra.com

Mise à jour du fichier ~ / .bashrc pour un script

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.

4
Nelson

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.

4
Malte Skoruppa