2012-08-11 6 views
37

Comment puis-je rediriger la sortie standard de plusieurs commandes vers une seule commande?Convertir plusieurs commandes en une seule commande

Exemple 1: combiner et trier la sortie de tous les trois commandes d'écho:

echo zzz; echo aaa; echo kkk 

sortie souhaitée:

aaa 
kkk 
zzz 

Exemple 2: réécrire les suivantes de sorte que toutes les commandes sont en une seule ligne de commande utilisant des canaux, sans redirections vers un fichier temporaire:

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo 

Répondre

66

Utilisez des parenthèses() pour combiner les commandes en un seul processus, qui concaténera le stdout de chacun d'eux.

Exemple 1 (notez que $ est l'invite du shell):

$ (echo zzz; echo aaa; echo kkk) | sort 
aaa 
kkk 
zzz 


Exemple 2:

(setopt; unsetopt; set) | sort 
+12

+1. Vous pouvez également utiliser des accolades qui ne génèrent pas un sous-shell. La syntaxe est un peu plus stricte: '{setopt; non-déclenché; ensemble; } | trier | less' - les espaces autour des accolades et le point-virgule sont obligatoires. –

+6

@glenn: cela n'a pas d'importance (testé dans bash 3.2.48), puisque le pipeline le force dans une sous-couche de toute façon. –

+1

Il convient de noter que le '$' est l'invite, ne fait pas partie de la commande – Gilly

0

Dans Windows, il serait comme suit: (echo zzz & echo aaa & echo kkk) | sort

Ou si il est dans un fichier batch, il peut être une ligne mono (comme exemple) ainsi que multiline:

(
echo zzz 
echo aaa 
echo kkk 
) | sort 

Note: Le message original ne mentionne pas qu'il est seulement pour Linux, donc j'ajouté la solution pour la ligne de commande Windows ... il est très utile lorsque vous travaillez avec VHD/VHDX avec diskpart dans les scripts (echo diskpart_command) au lieu de l'écho sur le même, mais laissez-le echo, il y a aussi un autre moyen sans échos et avec > redirecteur, mais il est très sujette à des erreurs et beaucoup plus complexe à écrire (pourquoi utiliser un moyen enclin aux erreurs compliquées si existe un façon simple qui fonctionne toujours bien) ... rappelez-vous également %d% vous donne le chemin réel (très utile pour ne pas coder en dur le chemin des fichiers VHD/VHDX).

7

Vous pouvez utiliser {} pour cela et d'éliminer la nécessité d'un sous-shell comme dans (list), comme ceci:

{ echo zzz; echo aaa; echo kkk; } | sort 

Nous avons besoin d'un caractère d'espacement après { et avant }. Nous avons également besoin de la dernière ; lorsque la séquence est écrite sur une seule ligne.

Nous aurions pu écrire sur plusieurs lignes sans avoir recours à une ;:

Exemple 1:

{ 
    echo zzz 
    echo aaa 
    echo kkk 
} | sort 

Exemple 2:

{ 
    setopt 
    unsetopt 
    set 
} | sort 
Questions connexes