2016-01-31 20 views
16

Quando si esegue il seguente script Bash, mi aspetto che stampi Hello. Invece, stampa una riga vuota ed esce.Tubazioni che non funzionano con il comando echo

echo 'Hello' | echo 

Perché non piping uscita echo-echo lavoro?

+2

Sembra che ti aspetti che il secondo "eco" si comporti come "gatto". –

risposta

25

echo stampa tutti i suoi argomenti. Non legge da stdin. Quindi il secondo echo stampa tutti i suoi argomenti (nessuno) ed esce, ignorando lo Hello su stdin.

Per un programma che legge i suoi stdin e stampe che per stdout, utilizzare cat:

$ echo Hello | cat 
Hello 
+1

o '$ echo Hello | xargs echo' che equivale a echo Hello | xargs' di default. – daGo

2

è perché echo (sia integrato e /bin/echo) non leggere nulla dal stdin.

Uso cat invece:

echo 'Hello' | cat 
Hello 

o senza tubi:

cat <<< 'Hello' 
3

tubazioni può essere fatto solo per i comandi che assumono input da stdin. Ma l'eco non prende dallo stdin. Prenderà input dall'argomento e lo stamperà. Quindi questo non funzionerà. Inorder to echo puoi fare qualcosa come echo $(echo 'hello')

8

Sembra che tu non capisca le pipe. In questo caso sono più correttamente noti come pipe anonimi, perché non hanno un nome (ci sono anche pipe denominate). Le pipe anonime funzionano solo tra processi correlati, ad esempio processi con lo stesso genitore.

I tubi sono parte del sistema IO risultante dalla libreria runtime C. Questi stream vengono memorizzati nel buffer (c'è un'eccezione) per impostazione predefinita. Fondamentalmente una pipe sta semplicemente collegando il buffer di output da un processo al buffer di input di un altro.

I primi tre flussi utilizzati (chiamati descrittori di file) sono numerati 0, 1 e 2. Il primo, 0, è noto come standard input o stdin (il nome utilizzato in C). Per impostazione predefinita, questo è collegato alla tastiera, ma può essere reindirizzato utilizzando il simbolo < o il nome del programma sul lato destro di una pipe.

Il secondo, 1, è noto come output standard o stdout. Di default questo è connesso allo schermo del terminale, ma può essere reindirizzato usando il simbolo > o il nome del programma sul lato sinistro di una pipe.

Quindi:

echo 'Hello' | echo 

prende l'uscita standard dai echo e passa all'input standard echo. Ma echo non legge lo stdin! Quindi non succede nulla.

Programmi di filtro elaborare i nomi file specificati sulla riga di comando. Se non vengono assegnati nomi di file, leggono lo stdin. Gli esempi includono cat, grep e sed, ma nonecho. Per esempio:

echo 'Hello' | cat 

visualizzerà 'Ciao', e il cat è inutile (spesso è).

echo 'Hello' | cat file1 

sarà ignorare l'uscita dal echo e solo visualizzare il contenuto di file1. Ricorda che lo stdin viene letto solo se non viene indicato un nome file.

Cosa ne pensi questo display?

echo 'Hello' | cat < file1 file2 

e perché?

Infine, il terzo flusso, 2, è chiamato errore standard, o stderr, e questo è buffer. Viene ignorato dalle pipe, perché funzionano solo tra stdin e stdout. Tuttavia, è possibile reindirizzare stderr di utilizzare stdout (vedi man dup2):

myprog 2>&1 | anotherprog 

Il 2>&1 significa "redirect descrittore di file 2 nello stesso posto come Fie descrittore 1".

Quanto sopra è un comportamento normale, tuttavia un programma può sovrascrivere tutto ciò se lo desidera. Ad esempio, potrebbe leggere dal descrittore di file 2. Ho omesso molti altri dettagli, tra cui altre forme di reindirizzamento come la sostituzione di processo e qui documenti.

Problemi correlati