2016-08-31 4 views
0

J'écris un script bash en ce moment qui a une déclaration pour vérifier si un répertoire contient des choses.Bash IF erreurs de redirection de code de sortie

En ce moment, le code est

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

Cependant, lorsque le dossier est bien vide, je voudrais l'erreur de ls à supprimer. Normalement, il dirait "No tel fichier ou répertoire", mais je veux rediriger cela vers/dev/null.

J'ai essayé de faire

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

Cela ne redirige tout vers/dev/null comme je voulais, mais il provoque aussi le répertoire à introuvable (essentiellement provoquant le code de sortie 1).

Quelle serait la bonne façon de procéder?

+1

Un répertoire vide ne doit pas provoquer d'erreur. Vous obtiendrez seulement cette erreur si le répertoire lui-même n'existe pas, pas s'il est vide. – Barmar

+0

Sauf si $ APPLICATIONS contient un caractère générique, par ex. '/ chemin/vers/répertoire/*' plutôt que juste le nom du répertoire. – Barmar

+0

@Barmar Il s'avère une autre facette du problème, c'est que mon emplacement où le répertoire était supposé être avait ses propres problèmes. * facepalm * –

Répondre

1

&> redirige à la fois stdout et stderr. Pour rediriger uniquement stderr, utilisez 2>.

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

Oups. Nous y allons. C'est le problème. –

0

APPLICATIONS vient? Et à quoi sert-il lorsque vous exécutez votre script?

J'ai trouvé que la meilleure façon d'exécuter une instruction if contre une commande est de faire ce qui suit:

if command; then 
    do something 
fi 

Dans votre cas, vous pouvez faire ce qui suit en supposant APPLICATIONS est au format /path/to/folder ou 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

Il ne lance pas la sortie de la commande 'ls' car il est utilisé comme argument de' test'. – Barmar

+0

Bon point, sans les crochets tenterait de l'exécuter. Je vais modifier ma réponse. –