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?
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?
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
o '$ echo Hello | xargs echo' che equivale a echo Hello | xargs' di default. – daGo
è perché echo
(sia integrato e /bin/echo
) non leggere nulla dal stdin
.
Uso cat
invece:
echo 'Hello' | cat
Hello
o senza tubi:
cat <<< 'Hello'
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')
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.
Sembra che ti aspetti che il secondo "eco" si comporti come "gatto". –