¿Cómo puedo enviar caracteres a un comando como si vinieran de un archivo?
Por ejemplo probé:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
En los shells que admiten cadenas aquí , incluidos bash
, zsh
y ksh93
, puede usar
wc <<< "apple pear orange"
Otros dos enfoques (que permiten la entrada de varias líneas sin esfuerzo adicional):
Use un "documento aquí":
La
EOF
cadena es un delimitador. Puedes usar cualquier cadena;EOF
Es solo una elección convencional.Use el tty como entrada:
Esto tiene el inconveniente de que el programa comienza a ejecutarse y comienza a leer la entrada, tan pronto como escribe su nombre. Esto puede ser desconcertante; por ejemplo:
fuente
<<<
formulario también permite la entrada de varias líneas sin esfuerzo adicional, ya que la"
cadena cerrada puede contener nuevas líneas. Por supuesto, el<< EOF
formulario (la sintaxis original del documento aquí) es más fácil de leer si tiene una entrada de varias líneas.<<<
word
, por supuesto, en el contexto del shell, aword
puede ser una cadena entre comillas, que contiene espacios y líneas nuevas. D'oh! Eso es tan obvio que no hace falta decirlo (y, de hecho, no lo veo mencionado en la página del manual). :-( ¡Gracias por señalarme esto!word
se define en la página de manual como "Una secuencia de caracteres considerados como una sola unidad por el shell" (también conocido como "token"), y debe saber que las cadenas entre comillas se tratan como "una sola unidad" en el sentido relevante (después de procesamiento de barra diagonal inversa, expansión variable, etc. "Pero, de hecho, ese es el propósito de las comillas dobles en el shell. (Las comillas simples también protegen de la expansión). El modelo de procesamiento del shell está muy bien pensado, y todo menos simple.Aunque hay varias soluciones válidas aquí, otra sintaxis que a veces puede ser útil es ejecutar un comando
<()
. Esto le permitiría crear más de 1 objeto descriptor de archivo en una línea de comando.Esto puede ser útil cuando está haciendo algo como comparar largas cadenas de texto, o si desea diferir parte del contenido que no está en un archivo.
Por ejemplo, comparando los archivos hosts en dos nodos sin tener que copiar el archivo hosts en el host local:
El
<
redirige a un archivo STDIN, y el()
crear un subnivel para ejecutar el comando entre paréntesis. Es el STDOUT del subshell que se pasa a STDIN del comando que se está ejecutando.Es una manera más fácil de crear más de 1 "archivo" de entrada para un comando que tratar de usar múltiples documentos aquí, o intentar hacer eco de múltiples comandos en una tubería al comando final.
fuente
<fileorpathname
redirige stdin, pero<(subcmd)
no lo hace; sustituye un nombre que cuando / si el programa lo abre puede leer stdout desde subcmd.< <(subcmd)
(espacio requerido) redirige stdin desde ese archivo, casi comosubcmd |
. Sudiff
podía leer una de sus entradas a partir de la entrada estándar mediante la especificación de un argumento de-
, pero no ambos.cmd <(cmd2 ...)
ycmd < <(cmd2 ...)
. El primero permite que los datos derivados (la salida de cmd2) se usen en lugar de un nombre de archivo. Este último es equivalente acmd2 ... | cmd
. Los comandos deben escribirse para aceptar explícitamente la entrada stdin y muchos no lo son. Esto es especialmente cierto para los scripts de shell.puedes usar una pipa
fuente
Es posible que desee utilizar algo similar a lo esperado. El siguiente es un ejemplo simple de abrir una sesión remota de telnet, esperar el aviso, enviar algunos datos, esperar una respuesta, dormir y salir.
fuente