¿Hay alguna manera de hacer esto efectivamente en bash?
/my/bash/script < echo 'This string will be sent to stdin.'
Soy consciente de que podría canalizar la salida del eco como este:
echo 'This string will be piped to stdin.' | /my/bash/script
bash
redirect
stdin
io-redirection
Todos los trabajadores son esenciales
fuente
fuente
echo
>
formulario de redirección abrirá un descriptor de archivo como fd0
(stdin), mientras que|
opens inicia un proceso hijo y adjunta su stdout (fd 1) al stdin del otro proceso. Este hecho puede tener consecuencias no triviales (piensan acerca de compartir las variables de entorno?)Respuestas:
Puedes usar una línea
heredoc
lo anterior es lo mismo que
o puede redirigir la salida de un comando, como
o puedes leer como
o simplemente
fuente
echo -e "\x01\x02..." | ./script
)<<<
? Me da vergüenza admitir que nunca lo había visto antes, y estoy totalmente desconcertado por ello. Intenté buscarlo en Google, pero mis resultados no han estado relacionados.Estabas cerca
Para entrada multilínea, los documentos aquí son adecuados:
Editar a los comentarios:
Para lograr una entrada binaria, diga
Si se sustituye
cat
por/my/bash/script
(o, de hecho cae la última pipa), esta impresiones:O, si querías algo un poco más geek:
¿Cuáles son los senos de los primeros 90 grados en flotadores binarios de 4 bytes?
fuente
xxd -r
(ood
) para filtrar el documento AQUÍTambién puedes usar
read
asífuente
Solución
Desea (1) crear salida
echo '…'
estándar en un proceso (como ) y (2) redirigir esa salida a la entrada estándar de otro proceso pero (3) sin el uso del mecanismo de tubería bash. Aquí hay una solución que coincide con las tres condiciones:La
<
redirección de entrada es normal para stdin. La<(…)
sustitución del proceso es bash. Aproximadamente crea un/dev/fd/…
archivo con la salida del comando de sustitución y pasa ese nombre de archivo en lugar del<(…)
, lo que resulta aquí, por ejemplo, enscript < /dev/fd/123
. Para más detalles, vea esta respuestaComparación con otras soluciones.
Un heredoc de una línea enviado a stdin
script <<< 'string'
solo permite enviar cadenas estáticas, no la salida de otros comandos.La sustitución de procesos sola, como en
diff <(ls /bin) <(ls /usr/bin)
, no envía nada a stdin. En cambio, la salida del proceso se pasa como el contenido de los archivos creados en segundo plano, equivalente a, por ejemplodiff /dev/fd/10 /dev/fd/11
. En ese comando,diff
no recibe ninguna entrada de stdin.Casos de uso
Me gusta que, a diferencia del mecanismo de tubería, el
< <(…)
mecanismo permite poner el comando primero y toda la entrada después, como es el estándar para la entrada desde las opciones de la línea de comando.Sin embargo, más allá de la estética de la línea de comandos, hay algunos casos en los que no se puede utilizar un mecanismo de tubería. Por ejemplo, cuando se debe proporcionar un determinado comando como argumento para otro comando, como en este ejemplo con
sshpass
.fuente
<<<
?Le permite a uno escribir múltiples líneas en un programa, sin que esa entrada se guarde en el historial, ni visible en
ps
. Simplemente presione Ctrl + C cuando termine de escribir para finalizarcat
.fuente
fuente
function oline() { sed -e ":a;N;\$!ba ;s?\n? ?g"; }
. En tercer lugar, esto sería mucho más comprensible con awk:awk -F '\n' 'ORS=" " { print } END { printf "\n"}'