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()?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top