Esistono diversi modi per farlo. Il più semplice è probabilmente questo:
cat <<EOF | sh
touch somefile
echo foo > somefile
EOF
Un altro, che secondo me è una sintassi migliore:
(
cat <<EOF
touch somefile
echo foo > somefile
EOF
) | sh
Anche questo funziona, ma senza la subshell:
{
cat <<EOF
touch somefile
echo foo > somefile
EOF
} | sh
Altre varianti:
cat <<EOF |
touch somefile
echo foo > somefile
EOF
sh
O:
{ cat | sh; } << EOF
touch somefile
echo foo > somefile
EOF
A proposito, mi aspetto che l'uso di cat
nella tua domanda sia un segnaposto per qualcos'altro. In caso contrario, eliminalo, in questo modo:
sh <<EOF
touch somefile
echo foo > somefile
EOF
Che potrebbe essere semplificato a questo:
sh -c 'touch somefile; echo foo > somefile'
o:
sh -c 'touch somefile
echo foo > somefile'
Reindirizzamento dell'output anziché delle tubazioni
sh >out <<EOF
touch somefile
echo foo > somefile
EOF
Usando cat
per ottenere l'equivalente di echo test > out
:
cat >out <<EOF
test
EOF
Più documenti qui
( cat; echo ---; cat <&3 ) <<EOF 3<<EOF2
hi
EOF
there
EOF2
Questo produce l'output:
hi
---
there
Ecco cosa sta succedendo:
- La shell vede
( ... )
ed esegue i comandi racchiusi in una subshell.
- Il gatto e l'eco sono abbastanza semplici. La
cat <&3
dice di correre gatto con descrittore di file (fd) 0 (stdin) Reindirizzamento da fd 3; in altre parole, elimina l'input da fd 3.
- Prima di
(...)
iniziare, la shell vede i due documenti qui reindirizzare e sostituisce fd 0 ( <<EOF
) e fd 3 ( 3<<EOF2
) con il lato di lettura delle pipe
- Una volta avviato il comando iniziale, la shell legge il suo stdin fino a quando non viene raggiunto EOF e lo invia al lato di scrittura della prima pipe
- Quindi, fa lo stesso con EOF2 e il lato di scrittura della seconda pipe
touch
a meno che non ci sia, cosa vuoi esattamente? è solo leggere il file di input e reindirizzare a un altro con stdout?