Retour d'une valeur unique à partir d'une fonction de script shell
-
01-10-2019 - |
Question
Exemple:
#!/bin/sh
a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}
r=`a`
echo $r
$r
contient t
ou f
mais aussi la sortie de la commande ls
.
Je peux écrire ls -1 a* >/dev/null 2>/dev/null
, mais s'il y a un script plus complexe qui peut être conduit à des erreurs.
Est-il possible de retourner une valeur unique de a()
?
La solution
Une fonction d'enveloppe peut retourner une valeur numérique. Considérons 0 et 1 plutôt que 'f' et 't'
#!/bin/sh
a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}
a
r=$?
echo $r
Ceci affichera encore écrire de la ls -1 a*
que vous voulez sans doute encore disposer, mais la valeur de r
sera soit 0 ou 1 et ne comprend pas la sortie.
Les autres exemples redirigeant la sortie soit d'une ligne ou un bloc entier sont bons, et, comme d'autres ont suggéré, vous devriez apprendre à connaître d'autres façons de tester pour des conditions (mais je supposais que l'ls
était une sorte d'un exemple arbitraire )
Autres conseils
vous ne devez pas utiliser ls
pour vérifier les fichiers commençant par a
. Il suffit d'utiliser le shell
a() {
shopt -s nullglob
ret="f"
for file in a*
do
ret="t"
break
done
echo "$ret"
}
Vous pouvez mettre une redirection sur une liste de commandes:
{ command1 command2 } >/dev/null
Si à un moment donné dans le script que vous ne voulez pas de sortie de commandes ultérieures, vous pouvez rediriger le exec
builtin la sortie du shell:
echo interesting exec >/dev/null echo boring
Notez que cela dure jusqu'à la fin du script, pas seulement jusqu'à la fin d'une fonction. Cela prend en charge des commandes après l'intéressante mais pas avant.
Il y a une façon de revenir l'effet de exec /dev/null
, à l'aide de manipulations de descripteurs de fichiers. Je ne recommande pas nécessairement bien, car il peut être difficile de travailler dans la pratique. L'idée est de délocaliser tout ce qui est relié à la sortie standard à un descripteur différent, puis rediriger la sortie standard vers un fichier différent, et enfin déplacer l'arrière vers la sortie standard de sortie standard d'origine.
{ exec 3>&1 # duplicate fd 3 to fd 1 (standard output) exec >/dev/null # connect standard output to /dev/null echo boring exec 1>&3 # connect standard output back to what was saved in fd 3 echo interesting exec >/dev/null # connect standard output to /dev/null again echo more boring } 3>/dev/null # The braced list must have its fd 3 connected somewhere, # even though nothing will actually be written to it.
a() {
ls -1 a* > /dev/null
[ "$?" == "0" ] && echo t || echo f
}
r=`a`
echo $r
Envisagez d'utiliser [-f nom de fichier] et d'autres tests de fichiers ainsi.