web-dev-qa-db-fra.com

Où puis-je placer une fonction Shell définie par l'utilisateur?

Je prévois de créer une fonction qui simplifierait les choses pour moi. La fonction serait quelque chose comme

function lazymode()
{
echo "Hello World!";
}

de sorte que lorsque j'utilise la commande lazymodedans le Shell, le résultat sera le Hello World!.

Quel fichier dois-je mettre la fonction définie par l'utilisateur?

13

Dépend de la fonction. Si c'est juste une ligne très simple comme celle-là, vous pouvez créer un alias ou coller la fonction dans ~/.bashrc (un fichier que bash charge au début).

Si vous créez quelque chose de plus charnu, il pourrait être plus judicieux de créer son propre script exécutable dans ~/bin/ qui n'existera pas par défaut (il ne s'agit que d'un répertoire) mais qui devrait se trouver dans votre chemin. N'oubliez pas que pour cela, le fichier doit être exécutable (chmod +x filename) et commence par une strophe #!/bin/bash appropriée.

La deuxième voie présente des avantages évidents:

  • C'est plus facile de voir ce qui est disponible
  • Une erreur de syntaxe ne surchargera pas votre profil
  • Vous n'avez pas besoin de continuer à réapprovisionner votre configuration bash si vous modifiez le script
  • Il est disponible pour tous les Shell tant que le chemin complet est utilisé ou que ~/bin/ est également dans le chemin de ce Shell (ce qui devrait être dans la plupart des cas, autant que je sache).
12
Oli

Le meilleur choix serait le fichier ~/.bashrc.

Vous pouvez écrire vos définitions de fonctions Shell directement dans votre fichier ~/.bashrc ou, si vous en avez beaucoup et que vous ne voulez pas encombrer votre fichier ~/.bashrc, vous pouvez toutes les placer dans un autre fichier de votre choix. source that fichier dans votre fichier ~/.bashrc. Par exemple, si le fichier contenant vos fonctions s'appelle bash_functions, ajoutez simplement dans votre fichier ~/.bashrc les lignes suivantes:

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

ou équivalent:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

. est juste une représentation symbolique de source. Le test if vérifie que le fichier /path/to/bash_functions existe avant de tenter de le générer.

Cette technique est très similaire à l’établissement d’alias dans ~/.bashrc en créant un fichier appelé ~/.bash_aliases et en utilisant une syntaxe similaire à celle décrite ci-dessus dans ~/.bashrc pour en vérifier l’existence, puis la rechercher.

4
Radu Rădeanu

Voici une procédure essentielle pour déclarer une fonction permanente:

  1. Ouvrez le fichier ~/.bashrc dans un éditeur de texte. L’éditeur de texte importe peu, tant que vous savez comment vous en servir et que vous ouvrez le /home/<username>/.bashrc

  2. À la fin du ~/.bashrc, déclarez votre propre fonction, par exemple:

    find_dirs(){
        find "$1" -type d
    }
    
  3. Enregistrez et fermez le fichier.

Le fichier ~/.bashrc est lu à chaque fois que vous ouvrez Shell interactif (nouvel onglet de terminal, connexion via sshou ouverture de TTY1 ou d’une autre console virtuelle). Cela ne sera pas disponible dans les fichiers de script, car ~/.bashrc n'est pas lu pour les shells non interactifs. Il n'est également pas disponible si vous exécutez bashavec l'option --norc.

Si vous souhaitez que la fonction soit disponible immédiatement dans l'onglet actuellement ouvert, utilisez la commande source ~/.bashrc.


Les fonctions prennent des arguments comme des commandes normales. Par exemple, $1 à $9 indique les paramètres de position lorsque vous appelez une fonction. Dans l'exemple ci-dessus, find_dirs prend un paramètre de position uniquement et serait appelé find_dirs /etc. Vous pouvez également utiliser $@ pour faire référence à tous les paramètres de position. Les fonctions acceptent également la redirection. Vous pouvez appeler une fonction avec find_dirs $1 > /dev/null; nous pourrions aussi le déclarer comme suit:

find_dirs(){
    find "$1" -type d
}

Note de man bash: "Les fonctions sont exécutées dans le contexte du shell actuel; aucun nouveau processus n'est créé pour les interpréter". Cela signifie que vous devez également connaître les fonctions permettant de modifier votre environnement d'exécution du shell, à savoir les variables et les paramètres de terminal.

1