web-dev-qa-db-fra.com

Comment appelez-vous une fonction définie dans .bashrc à partir du shell?

Dans mon .bashrc, j'ai une fonction appelée bonjour:

function hello() {
   echo "Hello, $1!"
}

Je veux pouvoir invoquer hello () à partir du shell comme suit:

$ hello Lloyd

Et obtenez la sortie:

> Hello, Lloyd!

C'est quoi le truc?

(La vraie fonction à laquelle je pense est plus compliquée, bien sûr.)

EDIT: Ceci est VRAIMENT provoqué par une erreur de syntaxe dans la fonction, je pense! :(

function coolness() {

    if[ [-z "$1"] -o [-z "$2"] ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
        echo "Hi!"
}
52
les2

Le test dans votre fonction ne fonctionnera pas - vous ne devriez pas avoir de crochets autour des clauses -z, et il devrait y avoir un espace entre if et le crochet ouvert. Il devrait se lire:

function coolness() {

    if [ -z "$1" -o -z "$2" ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
    echo "Hi!"
}
27
Cascabel

Vous pouvez exporter des fonctions. Dans votre ~/.bashrc fichier après avoir défini la fonction, ajoutez export -f functionname.

function hello() {
   echo "Hello, $1!"
}

export -f hello

Ensuite, la fonction sera disponible à l'invite du shell et également dans d'autres scripts que vous appelez à partir de là.

Notez qu'il n'est pas nécessaire d'exporter des fonctions à moins qu'elles ne soient utilisées dans des processus enfants (le "aussi" dans la phrase précédente). Habituellement, même dans ce cas, il est préférable de source la fonction dans le fichier dans lequel elle sera utilisée.

Modifier :

Les crochets dans les instructions conditionnelles Bash ne sont pas des crochets, ce sont des commandes. Ils doivent avoir des espaces autour d'eux. Si vous souhaitez regrouper des conditions, utilisez des parenthèses. Voici votre fonction:

function coolness() {

    if [ -z "$1" -o -z "$2" ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
        echo "Hi!"
}

Une meilleure façon d'écrire ce conditionnel est:

    if [[ -z "$1" || -z "$2" ]]; then

parce que les doubles crochets offrent plus de capacités que les simples.

71
Dennis Williamson

Incluez dans votre script la ligne

source .bashrc

essayez avec la construction source cela devrait fonctionner!

17
Lopoc

Toute modification apportée à .bashrc ne prendra effet que dans une nouvelle session de terminal. Si vous souhaitez appliquer les modifications à votre session de terminal actuelle, vous devez demander au shell de relire le .bashrc. Le moyen le plus court d'y parvenir est d'utiliser le . commande, synonyme de source:

[user@linuxPc]$ . ~/.bashrc
11
mihai
$ source .bashrc
4
PiedPiper