Reindirizzamento del contenuto di un file al comando "echo"


41

Ho un file chiamato il my_file.txtcui contenuto è solo la stringa Hello. Come potrei reindirizzare il suo contenuto al comando echo?

So di avere i comandi less, cat, more... ma ho bisogno di farlo con echo.

Ho provato questo:

$ cat my_file.txt | echo

e anche questo:

$ echo < my_file.txt

Ma in entrambi i casi appare solo uno spazio vuoto nello stdout, non il contenuto di my_file.txt.

Come potrei farlo?


7
Perché insisti per l'uso echo?
Kevin,

7
@Kevin, presumibilmente alla fine vuole espandere le sequenze di escape ANSI C ( \n, b...) nel file, che sarebbe un uso valido di echo(almeno uno standard echo). O presumibilmente vuole capire perché non funziona così. In ogni caso, nessun motivo per sottovalutare IMO.
Stéphane Chazelas,

3
Sono venuto qui perché ero curioso del perché non funziona quando faccio eco <file.txt. Sembra una domanda ragionevole avere a SE, la risposta è stata molto utile. +1 da me.
neuronet,

Risposte:


53

Puoi reindirizzare tutto ciò che vuoi, echoma non farà nulla con esso. echonon legge il suo input standard. Tutto ciò che fa è scrivere nell'output standard i suoi argomenti separati da un carattere spazio e terminati da un carattere di nuova riga (e con alcune echoimplementazioni con alcune sequenze di escape in esse espanse e / o argomenti che iniziano con -eventualmente trattati come opzioni).

Se si desidera echovisualizzare il contenuto di un file, è necessario passare tale contenuto come argomento a echo. Qualcosa di simile a:

echo "$(cat my_file.txt)"

Notare che $(...)spoglia il carattere newline finale s dall'output di tale catcomando, e echoaggiunge uno schienale.

Si noti inoltre che, tranne con zsh, non è possibile passare caratteri NUL negli argomenti di un comando, quindi in genere in genere non funzionerà con i file binari. yashrimuoverà anche i byte che non fanno parte di caratteri validi.

Se il motivo per voler fare questo è perché si vuole echoper espandere il \n, \b, \0351... sequenze di escape nel file (come UNIX conformant echoimplementazioni fanno, ma non tutti ), allora si preferisce utilizzare printfinvece :

printf '%b\n' "$(cat my_file.txt)"

Al contrario echo, quello è portatile e non avrà problemi se il contenuto del file inizia con -.


In alternativa al $(cat file), con ksh, zshe bash, si può anche fare:$(<file) . Questo è un operatore speciale per cui la shell invece di catleggere il contenuto del file per compensare l'espansione. Rimuove ancora le nuove righe finali e soffoca sui byte NUL tranne in zsh. In bash, che ancora forgia un ulteriore processo. Si noti inoltre che una differenza è che non si otterrà alcun errore se si tenta di leggere un file di tipo directory in quel modo. Inoltre, sebbene $(< file)sia speciale, $(< file; other command)non lo è (in zsh, quando non si emula un'altra shell, che espande comunque il contenuto di file, eseguendo il comando implicito $READNULLCMD (in genere un cercapersone)).


3
In entrambi bash e zsh si può saltare il cate solo il guscio letto in diretta: echo "$(<my_file.txt)".
Kevin,

1
Sì, con ksh , zsh e bash puoi usare $(<filename).
Dimitre Radoulov,

Grazie mille, è quello di cui avevo bisogno e ha funzionato! :-)
danielmbcn

@Kevin, Dimitre, aggiunto ora.
Stéphane Chazelas

4

Aggiungendo ad altre risposte, puoi anche provare a reindirizzare l'input invece di cat

echo $(<my_file.txt)

o

echo `<my_file.txt`

$()e `` eseguono la stessa cosa, eseguono comandi all'interno del loro ambito e forniscono l'output alla shell come se fosse stato fornito come input dall'utente. L'unica differenza tra questi due è che $ () può essere ricorsivo e `` non può essere ricorsivo.


2

Risposta semplice: non puoi. echo(sia esso shell incorporato o binario normale) non elabora il suo input standard - è solo un modo.


La domanda è: perché dovresti davvero farlo?
peterph

2

Come è stato detto,

Se si desidera echovisualizzare il contenuto di un file, è necessario passare tale contenuto come argomento aecho

Ad esempio, puoi farlo in questo modo xargs(considerando che devi abilitare l'interpretazione delle escape di barra rovesciata ):

$ cat my_file.txt | xargs echo -e

O semplicemente quello che hai chiesto (senza interpretazione delle sequenze di escape ):

$ cat my_file.txt | xargs echo

Si noti tuttavia che quando si utilizza xargs echo(lo stesso di xargsbtw come echocomando predefinito), sarà il echocomando del file system che verrà eseguito, non il echocomando incorporato della shell . Si noti inoltre che si xargsaspetta il suo input in un formato molto specifico (dove spazi vuoti, nuove righe, virgolette, barre rovesciate hanno un significato speciale). catnon ha molto senso qui come c'è un solo file di concatenare (stessa < file.txt xargs echonota che Unix compatibili. echos fanno espansione fuga backslash di default e uscita -esu echo -e.
Stéphane Chazelas

0

In bash, dovrebbe funzionare anche quanto segue:

echo `cat my_file.txt`

La parte in backtick è sostituita dall'output di quel comando, ovvero in questo caso sostituita dal contenuto del file.


Vero, i bastoncini funzionano come $( . . . ). Le persone che usano di $()solito le preferiscono perché puoi nidificarle. Questa domanda è vecchia, tuttavia, è molto più soddisfacente rispondere a domande a cui non è già stata data risposta!
Legge 29

Non proprio. C'è una sottile differenza. Quando viene utilizzato il modulo back-tick, una barra rovesciata mantiene il suo significato letterale tranne quando è seguita da $, `o \. Il primo segno di spunta non preceduto da una barra rovesciata termina il comando. Quando si utilizza il modulo $ (,,,), tutti i caratteri tra parentesi compongono il comando.
fpmurphy

Poiché tale sostituzione di comando non viene quotata, l'operatore split + glob verrà applicato ad esso. Ad esempio, se my_file.txtcontiene *, ciò stampa l'elenco dei nomi dei file nella directory corrente.
Stéphane Chazelas,
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.