Digamos que tengo un script que quiero canalizar a otro comando o redirigir a un archivo (canalizando shpara 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", simplemente piensa que es parte del heredoc.
¿Cómo puedo hacer que catproduzca texto desde stdin y luego lo canalice a una ubicación arbitraria?
shell
io-redirection
cat
here-document
Strugee
fuente
fuente

touches a menos que exista, ¿qué es exactamente lo que quieres? es solo leer el archivo de entrada y redirigir a otro con stdout?echo: me preguntaba cuál sería el equivalente de esocat.shscript a partir de múltiples cadenas y pasarlo directamente ash. Encontré su Q buscando pasar la salida de texto de múltiples comandos, incluido un documento AQUÍ, directamente a un comando. Que es lo que hace el segundo ejemplo de la respuesta de Ash.Respuestas:
Hay varias formas de hacer esto. Lo más simple es probablemente esto:
Otro, que es una sintaxis más agradable en mi opinión:
Esto también funciona, pero sin la subshell:
Más variaciones:
O:
Por cierto, espero que el uso de
caten su pregunta sea un marcador de posición para otra cosa. Si no, sácalo así:Lo que podría simplificarse a esto:
o:
Redirigir salida en lugar de tubería
Utilizando
catpara obtener el equivalente deecho test > out:Múltiples documentos aquí
Esto produce la salida:
Esto es lo que está pasando:
( ... )y ejecuta los comandos incluidos en un subshell.cat <&3dice ejecutar cat con el descriptor de archivo (fd) 0 (stdin) redirigido desde fd 3; en otras palabras, elimine la entrada de fd 3.(...)se inicie, el shell ve que los dos documentos aquí redirigen y sustituyen fd 0 (<<EOF) y fd 3 (3<<EOF2) con el lado de lectura de las tuberíasfuente
(cat; echo ---; exec <&3; cat) <<EOF 3<<EOF2 >outy luego dar esa entrada de comando con dos bloques aquí en una fila.catequivalente deecho test > outusar un heredoc. Mientras que su ejemplo dado agregó una redirección al final de la tubería.Solo quiero señalar que usar
meowes tan válido comoEOF.Este script se agregará
Meow!a un archivo llamadocat:Guardar como
catsy hacerlo ejecutable conchmod +x cats, luego ejecutarlo con./cats:Explicación:
cat <<meowes la sintaxis del documento aquí . Le indica al script que tome el bloque de texto que sigue a esta línea, hasta que encuentre la cadenameow. El contenido se generará (o se canalizará).>> cattuberías al archivo nombradocat.>lugar de>>sobrescribiría el archivo en lugar de agregarlo.Meow!es el contenido del documento aquí .meowes el marcador final para el documento aquí . Los contenidos, con el uso de>>, se adjuntan acat.Tubería tanto a stdout como a un archivo:
Para hacer la tubería que solicita, no se requiere ningún documento aquí .
catno puede generar texto de salida y pasar el texto, peroteees una combinación perfecta para lo que está pidiendo:Esto generará la cadena
echoy escribiráechoen un archivo llamadotee.También puede pasar la salida
cat, si eso es parte del requisito, ya sea con:O solo:
Contenido del archivo:
fuente
>crea tuberías como su última viñeta implica.>puede crear tuberíaszshcuando el mismo fd se redirige varias veces como enecho foo >&1 > teeoecho foo > tee | cat, dondezshimplementa un internoteepara alimentar la salida deechoamboscaty elteearchivo.