GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo usar la redirección de salida en combinación con Here-documents y Cat?

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
Relacionado:¿Tmux, TERM y 256 colores son compatibles?
Linux
  1. Cómo uso Vagrant con libvirt

  2. Trabajar con entrada, salida y redirección de errores en Linux

  3. Cómo usar Cat, Tac, More, Less – Comandos de Linux

  4. ¿Cómo uso sed para cambiar mis archivos de configuración, con claves y valores flexibles?

  5. ¿Cómo puedo usar comodines de estilo ms-dos con ls y mv?

Cómo usar el comando Cat de Linux (con ejemplos)

Cómo instalar y usar Helm en Kubernetes

¿Cómo instalar y usar Linux Screen?

Cómo instalar y usar PuTTY en Linux

Cómo instalar y usar Alpine con Gmail IMAP en Linux

Cómo instalar y usar el comando Ack en Linux con ejemplos