Linux / Debian - Cosa fa 'pipì' in moreutils?


Risposte:


29

Ecco cosa puoi fare con la pipì:

seq 5 -1 1 > file
cat file |pee 'sort -u > sorted' 'sort -R > unsorted'

Quindi pipì funziona con i tubi shell anziché i file.

bash non ha bisogno di pipì, può aprire i comandi della shell come file:

cat file |tee >(sort -u > sorted) >(sort -R > unsorted)

1
Funzionerebbe con i jocker dei nomi di file? Vedi zgp.org/~dmarti/tips/git-multiple-post-receive-hooks - pee è usato per moltiplicare stdine dare cloni a ogni script che calcola lo schema del nome del file, puro bash può farlo? AFAIU espanderebbe l'asterisco tra parentesi causando qualcosa del genere tee >(app1 app2 app3 app4)che non è >(app1) >(app2) >(app3) >(app4)che la tua risposta mostri
Arioch "Il

@Arioch, la sintassi bash non funzionerà con la tecnica hook-joker. Basta installare moreutils.
Tobu,

1
Utilizzare tee >/dev/nullper evitare di replicare stdin su stdout
jfs

1
il vero vantaggio di fare pipì su tee è che invia lo stdout da ogni processo secondario allo stdout della pipì stessa. con tee devi reindirizzare ogni processo stdout su un file se vuoi salvarlo, ma con pee devi solo salvare lo stdout. ovviamente questo ha senso solo se ogni comando secondario sta emettendo una cosa formattata in modo simile. come se non riuscissi a capire come fare o espressioni regolari in grep che potresti fare cat file | pee 'grep this' 'grep that' > lines.with.this.or.that.txt... usando tee ne otterrai una copia filesu stdout.
underrun

La >(command)funzione si chiama Sostituzione processo .
Vlastimil Ovčáčík,

16

Probabilmente è più facile capire se hai usato teeprima. Questo utile vecchio strumento accetta input standard e scrive su più file, oltre a output standard. Il seguente:

echo "Hello world" | tee one two

Creerà due file, denominati onee two, entrambi contenenti la stringa Hello world. Stampa anche sul tuo terminale.


Ora peesvolge una funzione simile ma invece di reindirizzare l'output su più file reindirizza a più comandi secondari, ala pipe. Si differenzia leggermente dal teerispetto che non invia lo stdin originale allo stdout perché non avrebbe senso combinarlo con l'output dei comandi secondari. Il seguente esempio molto semplice:

echo "Hello world" | pee cat cat

Trasmetterà la stringa Hello worldsul terminale due volte. Questo perché ciascuna delle due istanze di catriceve l'output standard e fa ciò che catfa, che è la stampa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.