Frage

Beispiel:

#!/bin/sh

a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}

r=`a`
echo $r

$r enthält t oder f sondern auch die Ausgabe des ls Befehl.

Ich kann ls -1 a* >/dev/null 2>/dev/null schreiben, aber wenn es ein komplexeres Skript, das zu Fehlern führen kann.

Gibt es eine Möglichkeit, einen einzelnen Wert von a() zurück?

War es hilfreich?

Lösung

Eine Shell-Funktion kann einen numerischen Wert zurück. Betrachten wir 0 und 1 statt 'f' und 't'

#!/bin/sh

a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}

a
r=$?
echo $r

Dies wird noch Schreib Ausgabe aus dem ls -1 a* die Sie wahrscheinlich noch entsorgen wollen, aber der Wert von r wird entweder 0 oder 1 und umfasst nicht die Ausgabe.

Die anderen Beispiele der Ausgabe entweder von einer Linie umgeleitet oder einen ganzen Block sind gut, und, wie andere vorgeschlagen, sollten Sie andere Möglichkeiten, um Test für Bedingungen kennen zu lernen (aber ich war der Annahme, die ls war irgendwie ein beliebiges Beispiel )

Andere Tipps

Sie müssen nicht ls verwenden für Dateien zu überprüfen, mit a starten. Verwenden Sie einfach die Shell

a() {
  shopt -s nullglob
  ret="f"
  for file in a*
  do   
    ret="t"
    break
  done
  echo "$ret"
}

können Sie eine Umleitung auf eine Liste von Befehlen setzen:

{
  command1
  command2
} >/dev/null

Wenn an einem bestimmten Punkt im Skript Sie keine Ausgabe von nachfolgenden Befehlen mögen, können Sie die Shell des Ausgangs mit dem exec builtin umleiten:

echo interesting
exec >/dev/null
echo boring

Beachten Sie, dass diese bis zum Ende des Skripts dauern, nicht nur bis zum Ende einer Funktion. Diese kümmert sich um Befehle nach dem interessant, aber nicht vor.

Es gibt einen Weg, um die Wirkung von exec /dev/null zurückzukehren, durch Dateideskriptors Manipulationen verwendet. Ich notwendigerweise es allerdings nicht empfehlen, da es schwierig sein kann, in der Praxis zu erarbeiten. Die Idee ist, zu verlagern, was auch immer auf die Standardausgabe an einen anderen Deskriptor verbunden ist, dann die Standardausgabe in eine andere Datei umleiten, und schließlich die ursprüngliche Standardausgabe zurück auf die Standardausgabe verlagern.

{
  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 

Betrachten Sie mit [-f Dateiname] und andere Datei Tests als auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top