Digamos que tengo un script que quiero canalizar a otro comando o redirigir a un archivo (canalizar a sh
para los ejemplos). Supongamos que estoy usando bash.
Podría hacerlo usando echo
:
echo "touch somefile
echo foo > somefile" | sh
También podría hacer casi lo mismo usando cat
:
cat << EOF
touch somefile
echo foo > somefile
EOF
Pero si reemplazo "EOF" con "EOF | sh” solo piensa que es parte del heredoc.
¿Cómo puedo hacer que cat
genera texto desde stdin y luego lo canaliza a una ubicación arbitraria?
Respuesta aceptada:
Hay varias maneras de hacer esto. El más simple es probablemente este:
cat <<EOF | sh
touch somefile
echo foo > somefile
EOF
Otro, que es una sintaxis más agradable en mi opinión:
(
cat <<EOF
touch somefile
echo foo > somefile
EOF
) | sh
Esto también funciona, pero sin la subcapa:
{
cat <<EOF
touch somefile
echo foo > somefile
EOF
} | sh
Más variaciones:
cat <<EOF |
touch somefile
echo foo > somefile
EOF
sh
O:
{ cat | sh; } << EOF
touch somefile
echo foo > somefile
EOF
Por cierto, espero el uso de cat
en su pregunta hay un marcador de posición para otra cosa. Si no, sácalo, así:
sh <<EOF
touch somefile
echo foo > somefile
EOF
Que podría simplificarse a esto:
sh -c 'touch somefile; echo foo > somefile'
o:
sh -c 'touch somefile
echo foo > somefile'
Redireccionamiento de salida en lugar de canalización
sh >out <<EOF
touch somefile
echo foo > somefile
EOF
Usando cat
para obtener el equivalente de echo test > out
:
cat >out <<EOF
test
EOF
Múltiples documentos aquí
( cat; echo ---; cat <&3 ) <<EOF 3<<EOF2
hi
EOF
there
EOF2
Esto produce la salida:
hi
---
there
Esto es lo que está pasando:
- El shell ve el
( ... )
y ejecuta los comandos adjuntos en una subcapa. - El gato y el eco son bastante simples. El
cat <&3
dice que ejecute cat con el descriptor de archivo (fd) 0 (stdin) redirigido desde fd 3; en otras palabras, elimine la entrada de fd 3. - Antes del
(...)
se inicia, el shell ve los dos redireccionamientos del documento aquí y los sustituye por fd 0 (<<EOF
) y fd 3 (3<<EOF2
) con el lado de lectura de las tuberías - Una vez que se inicia el comando inicial, el shell lee su stdin hasta que se alcanza el EOF y lo envía al lado de escritura de la primera tubería
- Luego, hace lo mismo con EOF2 y el lado de escritura de la segunda tubería