Où puis-je mettre une fonction shell définie par l'utilisateur?

14

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 , il affichera le Hello World!.

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

Abel Melquiades Callejo
la source

Réponses:

14

Dépend de la fonction. Si c'est juste une ligne simple comme ça, vous pouvez créer un alias ou coller la fonction ~/.bashrc(un fichier qui bash se charge quand il démarre).

Si vous créez quelque chose d'un peu plus charnu, il pourrait être plus judicieux de créer son propre script exécutable dans ~/bin/lequel n'existera pas par défaut (c'est juste un répertoire) mais devrait être dans votre chemin. N'oubliez pas que le fichier devra être exécutable ( chmod +x filename) et commencer par une #!/bin/bashstrophe appropriée .

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

  • Il est plus facile de voir ce qui est disponible
  • Une erreur de syntaxe ne remplira pas votre profil
  • Vous n'avez pas besoin de ressourcer votre configuration bash si vous changez le script
  • Il est disponible pour n'importe quel shell tant que le chemin complet est utilisé ou se ~/bin/trouve également dans le chemin de ce shell (ce qui devrait être dans la plupart des cas AFAIK).
Oli
la source
J'ai utilisé la dernière option. Ma fonction contient des commandes qui suppriment des fichiers, quelque chose de wget, exécute les commandes javac et java. et quand je l'ai essayé sur le gnome-terminal, ça ne fonctionne pas bien. Pensez-vous qu'il y a un problème?
Abel Melquiades Callejo
Que fait-il à la place?
Oli
C'est déjà réparé. Corrigé par cette réponse
Abel Melquiades Callejo
umm ... les scripts utilisateur ne devraient-ils pas être à la /usr/local/binplace jouer avec le $PATH?
Braiam
Il me semble qu'un petit mais intéressant avantage de mettre des fonctions ~/.bashrc(comme c'est sourced) est que Bash recherche des fonctions avant de faire une recherche PATH.
Zanna
4

Le meilleur choix serait le ~/.bashrcfichier.

Vous pouvez écrire vos définitions de fonction shell directement dans votre ~/.bashrcfichier, ou, si vous avez beaucoup d'entre eux et ne veulent pas encombrer votre ~/.bashrcfichier, vous pouvez les mettre tous dans un autre fichier de votre choix - juste être sûr de la source que fichier dans votre ~/.bashrcfichier. Par exemple, si le fichier avec vos fonctions est nommé bash_functions, ajoutez simplement dans votre ~/.bashrcfichier les lignes:

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

où l' .est n'est qu'une représentation symbolique de source. Le iftest vérifie que le fichier /path/to/bash_functionsexiste avant d'essayer de le source.

Cette technique est très similaire à l'établissement d'alias dans ~/.bashrcen créant un fichier appelé ~/.bash_aliaseset en utilisant une syntaxe similaire à celle ci-dessus dans ~/.bashrcpour tester son existence, puis le source.

Radu Rădeanu
la source
merci, ça a marché. au fait, quelle est sa différence avec .profile? dans certains linux, je ne peux pas mettre de fonctions dans bashrc
Abel Melquiades Callejo
2
~/.profileLe fichier est exécuté par l'interpréteur de commandes pour les shells de connexion. Lorsque vous utilisez l'interface graphique et que vous ouvrez le terminal, ce fichier n'est pas exécuté car vous serez dans un shell sans connexion.
Radu Rădeanu
1

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

  1. Ouvrez le ~/.bashrcfichier dans un éditeur de texte. Peu importe l'éditeur de texte, tant que vous savez comment l'utiliser et tant que vous ouvrez le/home/<username>/.bashrc

  2. À la fin de la ~/.bashrcdéclaration de votre propre fonction, par exemple:

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

Le ~/.bashrcfichier est lu à chaque fois que vous ouvrez un shell interactif (c'est-à-dire un nouvel onglet de terminal, une connexion via sshou une ouverture de TTY1 ou d'une autre console virtuelle). Cela ne sera pas disponible dans les fichiers de script, car il ~/.bashrcn'est pas lu pour les shells non interactifs. Il n'est également pas disponible si vous exécutez bashavec --norcoption.

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


Les fonctions prennent des arguments comme les commandes normales. Par exemple, $1via $9indique les paramètres de position lorsque vous appelez une fonction. Dans l'exemple ci-dessus find_dirsprend un seul paramètre positionnel et serait appelé comme 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 également 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 courant; aucun nouveau processus n'est créé pour les interpréter". Cela signifie que vous devez également être conscient des fonctions capables de modifier votre environnement d'exécution du shell - modifier les variables et les paramètres du terminal.

Sergiy Kolodyazhnyy
la source