2010-03-25 6 views
10

J'ai un script. Je voudrais donner à ce script un mode silencieux et un mode verbeux.Comment rediriger conditionnellement la sortie d'une commande vers/dev/null?

Ceci est l'équivalent de:

if $verbose 
then 
    redirect="> /dev/null" 
fi 

echo "Verbose mode enabled" $redirect # This doesn't work because the redirect isn't evaluated. 

Je voudrais vraiment une meilleure façon de le faire que d'écrire si-elses pour chaque instruction affectée.

eval peut fonctionner, mais a des effets secondaires évidents sur d'autres variables.

Répondre

10

Vous pouvez écrire une fonction wrapper:

redirect_cmd() { 
    # write your test however you want; this just tests if SILENT is non-empty 
    if [ -n "$SILENT" ]; then 
     "[email protected]" > /dev/null 
    else 
     "[email protected]" 
    fi 
} 

Vous pouvez alors l'utiliser pour exécuter une commande avec la redirection:

redirect_cmd echo "unsilenced echo" 
redirect_cmd ls -d foo* 

SILENCE=1 
redirect_cmd echo "nothing will be printed" 
redirect_cmd touch but_the_command_is_still_run 

(Si tout ce que vous devez faire est de l'écho à cela, vous pouvez bien sûr rendre la fonction plus simple, juste en écho le premier argument au lieu de les exécuter tous comme une commande)

+0

J'aime cette solution. 'echo' était juste un exemple. J'aurais pu en choisir un meilleur. –

+1

L'exemple est incorrect. utilisez '" $ @ "', pas '$ @'. – vladr

+0

@Vlad: Oups. Je ne sais pas ce qui est arrivé à mes citations obsédantes habituelles. Édité! – Cascabel

2

Pas parfait, mais que diriez-vous la mise en redirect soit "/ dev/null" ou "/ dev/TTY", et puis en faisant

{ 
    echo "verbose" 
    .... 
} > $redirect 
+4

'/ dev/stdout', pas'/dev/tty'. L'utilisation de ce dernier l'amènera toujours à s'afficher même si le script est redirigé. –

5

a eu l'idée de another question:

#!/bin/sh 

if [ $SILENT ]; then 
    exec &>/dev/null 
fi 

echo "Silence here." 
+1

Ce test pour votre if donnera des erreurs si SILENT est la chaîne vide. – Cascabel

+2

'if [-n" $ SILENT "]' –

0

A examiner vaut la valeur set -x pour la journalisation détaillée à stderr en mode verbose. Si c'est le cas, la sortie verbose-only peut être obtenue avec un : comme ceci.

while getopts "v" o 
do case "$o" in 
    v) set -x;; 
    esac 
done 

echo "This will always be output"   # goes to stdout 
: this will only be output in verbose mode # goes to stderr 

: évalues ​​ses arguments, mais ne fait rien avec eux. set -x affichera ce qui a été évalué sur stderr lorsque chaque instruction est exécutée.

Il vous permet également de diviser les journaux détaillés et standard par flux.

Peut ne pas être ce dont vous avez besoin ici, mais ce peut être un truc pratique.

Questions connexes