Tubulação de vários comandos

8

Gostaria de executar o seguinte comando e pipe stout de ambos no TextEdit:

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

Isso não funciona, apenas executa o último:

Quão?

njboot
fonte

Respostas:

11

Aahhh, bashredirecionamento: -

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

Isso executa seus comandos como um único comando bash (esse é o efeito de &&) em um sub-shell (que é o que o envolve ()) e redireciona a saída do sub-shell para o TextEdit para você. Você tecnicamente não tem que usar &&em vez de ;, mas o efeito da mudança é que, se qualquer um dos comandos falhar ele irá parar toda a cadeia nesse ponto.

Nota: No seu exemplo, todos os comandos estão sendo executados (como você pode comprovar executando apenas pmset -g; echo; pmset -g assertionsna linha de comando), apenas aplicando o canal apenas ao último. É por isso que ele precisa ser executado em um subshell.

Nota: você pode substituir o |caractere >e enviar a saída para um arquivo, se desejar.

Tony Williams
fonte
Esta pequena dica foi incrivelmente útil. Os detalhes dos comandos / caracteres especiais incorporados são pouco documentados. Mais uma vez obrigado.
Njboot
4

() combinam os comandos em um único processo, concatenando-os para stdout:

(pmset -g; echo; pmset -g assertions) | open -f -a TextEdit
eu vou
fonte