2016-08-31 1 views
0

Ich schreibe gerade ein Bash-Skript, das eine Anweisung hat, um zu überprüfen, ob ein Verzeichnis Zeug enthält.Bash IF Exit Code Redirect Fehler

Gerade jetzt, ist der Code

if [ "$(ls -A $APPLICATIONS)" ]; then 
    do something 
else 
    do something else 
fi 

Wenn jedoch der Ordner tatsächlich leer ist, würde ich die Fehler von ls mag unterdrückt werden. Normalerweise würde es "Keine solche Datei oder Verzeichnis" sagen, aber ich möchte das zu/dev/null umleiten.

Ich habe versucht,

if [ "$(ls -A $APPLICATIONS &> /dev/null)" ]; then 

zu tun, die alles tut Umleitung auf/dev/null, wie ich wollte, aber es verursacht auch das Verzeichnis nicht gefunden werden (im wesentlichen Exit-Code verursacht 1).

Was wäre der richtige Weg?

+1

Ein leeres Verzeichnis sollte keinen Fehler verursachen. Sie erhalten diesen Fehler nur, wenn das Verzeichnis selbst nicht existiert und nicht leer ist. – Barmar

+0

Wenn "$ APPLICATIONS" keinen Platzhalter enthält, z. '/ Pfad/zu/Verzeichnis/*' und nicht nur der Verzeichnisname. – Barmar

+0

@Barmar Eine weitere Facette des Problems ist, dass mein Standort, wo das Verzeichnis sein sollte, eigene Probleme hatte. * facepalm * –

Antwort

1

&> leitet beide stdout und stderr um. Um nur stderr umzuleiten, verwenden Sie 2>.

if [ "$(ls -A $APPLICATIONS 2> /dev/null)" ]; then 
+0

Whoops. Da gehen wir. Das ist das Problem. –

0

Woher kommt APPLICATIONS? Und was ist festgelegt, wenn Sie Ihr Skript ausführen?

ich festgestellt, dass der beste Weg, eine if-Anweisung gegen einen Befehl auszuführen ist folgendes zu tun:

if command; then 
    do something 
fi 

In Ihrem Fall können Sie die folgenden Aktionen unter der Annahme APPLICATIONS ist im Format /path/to/folder oder local/folder:

#!/bin/bash 

APPLICATIONS="$1" 

[[ -z "$APPLICATIONS" ]] && exit 1 # Exit if APPLICATIONS is not set. 

if ls -A -- "$APPLICATIONS"/* &>/dev/null; then 
    echo do something # Directory is not empty 
else 
    echo do something else  # Directory is empty 
fi 
+0

Die Ausgabe des 'ls'-Befehls wird nicht ausgeführt, da sie als Argument für' test' verwendet wird. – Barmar

+0

Guter Punkt, ohne die eckigen Klammern würde versuchen, es auszuführen. Ich werde meine Antwort ändern. –