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:
( ... )
et exécute les commands incluses dans un sous-shell. 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. (...)
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