Écho de Bash Scripting localement dans une fonction

13

Dans les scripts bash, j'essaie de garder mes variables locales aux fonctions partout où je peux, puis de passer ce dont j'ai besoin à partir de fonctions comme ci-dessous

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"   # return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

Mais est-il possible de le faire en incluant les propres échos de la fonction de sorte que si la fonction a ses propres messages à produire, je n'ai pas à les attraper dans une variable

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now"   # do not return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"                         # should only echo 'value'
TheLovelySausage
la source
1
Hé, pourquoi utilisez-vous tous l'ancienne function foo()syntaxe non POSIX ? Vous pouvez obtenir une meilleure compatibilité POSIX avec 9 raccourcis clavier en moins.
Arthur2e5
2
Cette syntaxe m'est juste plus familière
TheLovelySausage
1
@ Arthur2e5 principalement parce qu'il est plus facile de taper "fonction" que "[a-zA-Z0-9] + \ (\) \ {" lors de la recherche dans le code
Alex Jansen

Réponses:

16

Tout ce qui est imprimé par la fonction peut être capturé si vous capturez le bon flux de sortie. Donc, le moyen le plus simple d'imprimer quelque chose et d'enregistrer une autre sortie est de rediriger la sortie superflue vers l'erreur standard:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"
    echo "This function is done now" >&2
}

Une autre possibilité est de se connecter à un fichier plutôt que d'imprimer directement des messages de journal, par exemple en utilisant quelque chose comme ceci:

log() {
    printf '%s\n' "$@" > my.log
}

Cela dit, les fonctions Bash ne peuvent pas renvoyer de variables . La seule valeur "retour" réelle est le code de sortie. Pour cette raison ( et bien d'autres ), si vous voulez une journalisation fiable, des valeurs de retour, une gestion des exceptions et plus encore, vous voudrez utiliser un langage différent comme Python, Ruby ou Java.

l0b0
la source
5

Vous pouvez présenter des messages d'information sur l'erreur standard:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now" > /dev/stderr  # goes to the screen
}

Quelques autres suggestions sont dans cet article du Linux Journal : utilisez des variables globales (que vous avez mentionnées que vous ne préférez pas), ou passez le nom de la variable pour renvoyer le résultat.

cxw
la source
/dev/stderrpointe vers fd 2 et peut toujours être redirigé par &>blahou 2>blah. /dev/ttypeut-être mieux.
Arthur2e5