reindirizzamento I / O zsh: reindirizzamento e quindi piping; cosa sta succedendo?


8

Qualcuno può spiegare cosa sta succedendo in questo comando:

echo foo >&2 | grep foo

Zsh (5.0.2) stampa foodue volte. Uno apparentemente su stdout e uno su stderr, poiché eseguendo questi comandi:

{ echo foo >&2 | grep foo } >/dev/null

e:

{ echo foo >&2 | grep foo } 2>/dev/null

entrambi stampano foouna volta sola.

Risposte:


5

Questo è l'effetto di MULTIOS .

echo foo >&2 | grep foo

scriverà fooin stderr e anche tubo foodi grep. Poiché lo standard stderr passa al terminale, vedrai due foorighe, una da echo, una dal greprisultato.

{ echo foo >&2 | grep foo } >/dev/null

Qui, hai visto una riga perché stdout è stato reindirizzato a /dev/null, hai visto solo la foolinea da echo.

{ echo foo >&2 | grep foo } 2>/dev/null

Qui, hai visto una linea perché stderr è stato reindirizzato a /dev/null, hai visto solo la foolinea da grep.

Puoi vedere facilmente la differenza nel terminale dal colore di uscita della linea. grepevidenzierà il modello corrispondente (o puoi forzarlo utilizzando --color=always).


MULTIOSè stato abilitato di default con l' nomultiosopzione unset:

$ unsetopt | grep nomultios
nomultios

Per disabilitarlo, basta impostare l' nomultiosopzione:

$ setopt nomultios

Ah, non sapevo che zsh potesse farlo! Capisco (sostanzialmente) il reindirizzamento, volevo sapere perché il comando non era equivalente {echo foo >&2} | grep foo, se vedi quello che sto cercando di dire. Ho pensato che il comando di cui avevo chiesto sopra avrebbe reindirizzato stdout a stderr e quindi reindirizzato stdout vuoto a grep.
Zorawar,

@Zorawar: questa domanda non è stata affrontata nel tuo post, quindi risponderò qui. In {echo foo >&2} | grep foo, è {echo foo >&2}stato considerato come un comando ed è stato eseguito in una subshell. Si può pensare le cose come A | grep foodove Aè {echo foo >&2}. In questo caso, >&2e |sono stati separati, MULTIOSnon ha alcun effetto qui.
cuonglm

@Zorawar Questo caso è il motivo per cui ho finito per disattivare il multios. È un'idea carina, ma in pratica l'ho trovata spesso fastidiosa e raramente utile.
Gilles 'SO- smetti di essere malvagio' il

@cuonglm, ho un'altra domanda che viene posta qui ma non ho ricevuto risposta. Se lo sai e hai anche tempo, potresti aiutarmi, per favore?
Liu Sha
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.