Comment utilisez-vous la redirection de sortie en combinaison avec here-documents et cat?

Disons que j'ai un script que je veux canaliser vers une autre command ou redirect vers un file (piping sh pour les exemples). Supposons que j'utilise bash.

Je pourrais le faire en utilisant echo :

 echo "touch somefile echo foo > somefile" | sh 

Je pourrais aussi faire presque la même chose en utilisant un cat :

 cat << EOF touch somefile echo foo > somefile EOF 

Mais si je remplace "EOF" par "EOF | sh" il pense juste que c'est une partie de l'heredoc.

Comment puis-je le faire pour que cat produise du text à partir de stdin, puis le dirige vers un location arbitraire?

    Il y a plusieurs façons de le faire. Le plus simple est probablement ceci:

     cat <<EOF | sh touch somefile echo foo > somefile EOF 

    Un autre, qui est une syntaxe plus agréable à mon avis:

     ( cat <<EOF touch somefile echo foo > somefile EOF ) | sh 

    Cela fonctionne aussi, mais sans le sous-shell:

     { cat <<EOF touch somefile echo foo > somefile EOF } | sh 

    En passant, je pense que l'utilisation de cat dans votre question est un espace réservé pour autre chose. Sinon, retirez-le, comme ceci:

     sh <<EOF touch somefile echo foo > somefile EOF 

    Ce qui pourrait être simplifié à ceci:

     sh -c 'touch somefile; echo foo > somefile' 

    Redirection de la sortie au lieu de la tuyauterie

     sh >out <<EOF touch somefile echo foo > somefile EOF 

    Utiliser cat pour get l'équivalent du echo test > out :

     cat >out <<EOF test EOF 

    Plusieurs documents ici

     ( cat; echo ---; cat <&3 ) <<EOF 3<<EOF2 hi EOF there EOF2 

    Cela produit la sortie:

     hi --- there 

    Voici ce qui se passe:

    • Le shell voit le ( ... ) et exécute les commands incluses dans un sous-shell.
    • Le chat et l'écho sont assez simples. Le cat <&3 dit courir chat avec le descripteur de file (fd) 0 (stdin) redirigé de fd 3; en d'autres termes, extraire l'input de fd 3.
    • Avant que le (...) ne démarre, le shell voit les deux ici redirect et replace fd 0 ( <<EOF ) et fd 3 ( 3<<EOF2 ) par le côté lecture des tuyaux
    • Une fois que la command initiale est lancée, le shell lit son stdin jusqu'à ce que EOF soit atteint et l'envoie vers le côté écriture du premier tube
    • Ensuite, il fait de même avec EOF2 et le côté écriture du deuxième tuyau