Piping de plusieurs commandes

8

Je voudrais exécuter la commande suivante et le tube stout des deux vers TextEdit:

pmset -g; echo; pmset -g assertions | open -f -a TextEdit 

Cela ne fonctionne pas, il exécute uniquement ce dernier:

Comment?

njboot
la source

Réponses:

11

Aahhh, bashredirection: -

( pmset -g && echo && pmset -g assertions ) | open -f -a TextEdit

Cela exécute vos commandes en tant que commande bash unique (c'est l'effet de &&) dans un sous-shell (ce qui est ce qui l'enveloppe ()) et redirige la sortie du sous-shell dans TextEdit pour vous. Techniquement, vous n'avez pas à utiliser à la &&place de ;mais l'effet de la modifier est que si l'une des commandes échoue, elle arrêtera toute la chaîne à ce stade.

Remarque: Dans votre exemple, toutes les commandes sont en cours d'exécution (comme vous pouvez le prouver en exécutant simplement pmset -g; echo; pmset -g assertionssur la ligne de commande), c'est juste que vous appliquez le canal uniquement à la dernière. C'est pourquoi il doit être exécuté en sous-shell.

Remarque: vous pouvez remplacer le |caractère par >et envoyer la sortie vers un fichier si vous le souhaitez.

Tony Williams
la source
Ce petit conseil a été incroyablement utile. Les tenants et aboutissants des commandes / caractères spéciaux intégrés sont à peine documentés. Merci encore.
njboot
4

() combine les commandes en un seul processus, les concaténant en stdout:

(pmset -g; echo; pmset -g assertions) | open -f -a TextEdit
je vais
la source