Digamos que tengo un script que quiero canalizar a otro comando o redirigir a un archivo (canalizando 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", simplemente piensa que es parte del heredoc.
¿Cómo puedo hacer que cat
produzca texto desde stdin y luego lo canalice a una ubicación arbitraria?
shell
io-redirection
cat
here-document
Strugee
fuente
fuente
touch
es 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
.sh
script 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
cat
en 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
cat
para 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 <&3
dice 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 >out
y luego dar esa entrada de comando con dos bloques aquí en una fila.cat
equivalente deecho test > out
usar un heredoc. Mientras que su ejemplo dado agregó una redirección al final de la tubería.Solo quiero señalar que usar
meow
es tan válido comoEOF
.Este script se agregará
Meow!
a un archivo llamadocat
:Guardar como
cats
y hacerlo ejecutable conchmod +x cats
, luego ejecutarlo con./cats
:Explicación:
cat <<meow
es 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á).>> cat
tuberías al archivo nombradocat
.>
lugar de>>
sobrescribiría el archivo en lugar de agregarlo.Meow!
es el contenido del documento aquí .meow
es 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í .
cat
no puede generar texto de salida y pasar el texto, perotee
es una combinación perfecta para lo que está pidiendo:Esto generará la cadena
echo
y escribiráecho
en 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íaszsh
cuando el mismo fd se redirige varias veces como enecho foo >&1 > tee
oecho foo > tee | cat
, dondezsh
implementa un internotee
para alimentar la salida deecho
amboscat
y eltee
archivo.