C'è una distinzione tra gli argomenti della linea di comando e lo standard input. Una pipe collega lo standard output di un processo allo standard input di un altro. Quindi
ls | echo
collega lo standard output di ls allo standard input di echo. Va bene, vero? Bene, echo ignora lo standard input e scaricherà i suoi argomenti della linea di comando - che in questo caso non sono nessuno - sul proprio stdout. L'output: niente di niente.
Ci sono alcune soluzioni in questo caso. Una è quella di usare un comando che legga stdin e scarichi su stdout, come cat.
ls | cat
Funzionerà, a seconda della vostra definizione di lavoro.
Ma che dire del caso generale. Quello che volete veramente è convertire lo stdout di un comando in args della linea di comando di un altro. Come altri hanno detto, xargs
è il canonico strumento di aiuto in questo caso, leggendo gli argomenti della linea di comando di un comando dal suo stdin, e costruendo i comandi da eseguire.
ls | xargs echo
Potresti anche convertire questo un po’, usando il comando di sostituzione $()
echo $(ls)
farebbe anche quello che vuoi.
Entrambi questi strumenti sono piuttosto fondamentali per lo scripting di shell, dovresti impararli entrambi.
Per completezza, come indicate nella domanda, l'altro modo di base per convertire stdin in args della linea di comando è il comando integrato della shell read
. Esso converte le “parole” (parole come definite dalla variabile IFS
) in una variabile temporanea, che potete usare in qualsiasi esecuzione di comando.