Disons que j'ai un script que je veux diriger vers une autre commande ou rediriger vers un fichier (diriger vers 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 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 faire en sorte que cat
sort le texte de stdin, puis le redirige vers un emplacement arbitraire ?
Réponse acceptée :
Il existe plusieurs façons de procéder. Le plus simple est probablement celui-ci :
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
Plus de variantes :
cat <<EOF |
touch somefile
echo foo > somefile
EOF
sh
Ou :
{ cat | sh; } << EOF
touch somefile
echo foo > somefile
EOF
Au fait, je m'attends à l'utilisation de cat
dans votre question est un espace réservé pour autre chose. Sinon, sortez-le, comme ceci :
sh <<EOF
touch somefile
echo foo > somefile
EOF
Ce qui pourrait être simplifié à ceci :
sh -c 'touch somefile; echo foo > somefile'
ou :
sh -c 'touch somefile
echo foo > somefile'
Redirection de la sortie au lieu de canalisation
sh >out <<EOF
touch somefile
echo foo > somefile
EOF
Utilisation de cat
pour obtenir l'équivalent de 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 commandes jointes dans un sous-shell. - Le chat et l'écho sont assez simples. Le
cat <&3
dit d'exécuter cat avec le descripteur de fichier (fd) 0 (stdin) redirigé depuis fd 3 ; en d'autres termes, extraire l'entrée de fd 3. - Avant le
(...)
est démarré, le shell voit ici les deux redirections de document et remplace fd 0 (<<EOF
) et fd 3 (3<<EOF2
) avec le côté lecture des tubes - Une fois la commande initiale lancée, le shell lit son stdin jusqu'à ce qu'EOF soit atteint et l'envoie du côté écriture du premier tube
- Ensuite, il fait la même chose avec EOF2 et le côté écriture du deuxième tube