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'
bash
shell-script
function
TheLovelySausage
la source
la source
function foo()
syntaxe non POSIX ? Vous pouvez obtenir une meilleure compatibilité POSIX avec 9 raccourcis clavier en moins.Réponses:
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:
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:
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.
la source
Vous pouvez présenter des messages d'information sur l'erreur standard:
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.
la source
/dev/stderr
pointe vers fd 2 et peut toujours être redirigé par&>blah
ou2>blah
./dev/tty
peut-être mieux.