2017-08-15 1 views
3

J'ai un filtre que je veux activer en option et je me demande comment je peux le faire dans bash d'une manière propre.Comment puis-je utiliser un filtre de canal conditionnel dans bash?

FILTER="| sort" # also can be empty 
ls $FILTER | cat 

Ce code ne fonctionne pas parce qu'il appellera ls avec | et sort en tant que paramètres.

Comment est-ce que je peux faire ceci correctement? Veuillez noter que j'essaie d'éviter de créer des blocs if afin de garder le code facile à maintenir (ma chaîne de tuyauterie est considérablement plus complexe que cet exemple)

+0

Ces filtres vont-ils recevoir n'importe quel type de paramètres? – sobolevn

Répondre

3

Ce que vous avez en tête ne fonctionne pas parce que l'expansion des variables se produit après la syntaxe a été analysée.

Vous pouvez faire quelque chose comme ceci:

foo_cmd | if [ "$order" = "desc" ] ; then 
    sort -r 
else 
    sort 
fi | if [ "$cut" = "on" ] ; then 
    cut -f1 
else 
    cat 
fi 
0

Vous pouvez créer la commande et l'exécuter dans un autre shell.

FILTER="| sort" # create your filter here 
# ls $FILTER | cat <-- this won't work 
bash -c "ls $FILTER | cat" 

# or create the entire command and execute (which, i think, is more clean) 
cmd="ls $FILTER | cat" 
bash -c "$cmd" 

Si vous sélectionnez cette approche, vous devez vous assurer que la commande est syntaxiquement valide et fait exactement ce que vous avez l'intention, au lieu de faire quelque chose désastreuse.

+0

Cela viendrait avec tous les inconvénients de l'exécution de code dynamique et devrait être évitée. – hek2mgl

+0

@ hek2mgl Je suis d'accord, mais si j'ai bien compris, l'OP essaie de faire exactement la même chose en appliquant un filtre défini dans une variable sans vouloir utiliser de constructions conditionnelles. Il doit s'assurer que la commande est valide par d'autres moyens. – Anubis