Tengo un archivo llamado my_file.txtcuyo contenido es solo la cadena Hello. ¿Cómo podría redirigir su contenido al comando echo?
Sé que tengo los comandos less, cat, more... pero tengo que hacerlo con echo.
Intenté esto:
$ cat my_file.txt | echo
y también esto:
$ echo < my_file.txt
Pero en ambos casos, solo aparece un espacio en blanco en el stdout, no el contenido de my_file.txt.
¿Cómo podría hacer eso?
shell
io-redirection
echo
danielmbcn
fuente
fuente

echo?\n,b...) en el archivo, lo que sería un uso válido deecho(al menos un estándarecho). O presumiblemente quiere entender por qué no funciona de esa manera. En cualquier caso, no hay razón para rechazar la OMI.Respuestas:
Puedes redirigir todo lo que quieras
echopero no hará nada con él.echono lee su entrada estándar. Todo lo que hace es escribir en la salida estándar sus argumentos separados por un carácter de espacio y terminados por un carácter de nueva línea (y con algunasechoimplementaciones con algunas secuencias de escape en ellas expandidas y / o argumentos comenzando con-posiblemente tratados como opciones).Si desea
echomostrar el contenido de un archivo, debe pasar ese contenido como argumento aecho. Algo como:Tenga en cuenta que
$(...)despoja al carácter de nueva línea de arrastre s de la salida de esecatcomando, yechoañade una vuelta.También tenga en cuenta que, excepto con
zsh, no puede pasar caracteres NUL en los argumentos de un comando, por lo que lo anterior normalmente no funcionará con archivos binarios.yashtambién eliminará los bytes que no forman parte de los caracteres válidos.Si la razón para querer hacer eso es porque quiere
echoampliar el\n,\b,\0351... secuencias de escape en el archivo (como UNIX conformesechoimplementaciones hacen, pero no en todos ), entonces prefiere utilizarprintfen su lugar :Al contrario
echo, ese es portátil y no tendrá problemas si el contenido del archivo comienza con-.Como alternativa a
$(cat file), conksh,zshybash, también se puede hacer:$(<file). Es un operador especial mediante el cual el shell , en lugar decatleer, lee el contenido del archivo para completar la expansión. Todavía despoja las líneas nuevas y chokes finales en bytes NUL excepto enzsh. Enbasheso todavía se bifurca un proceso extra. También tenga en cuenta que una diferencia es que no obtendrá ningún error si intenta leer un archivo de tipo directorio de esa manera. Además, si bien$(< file)es especial,$(< file; other command)no lo es (enzsh, cuando no se emula a otro shell, eso aún expandiría el contenido delfile, ejecutando el comando implícito$READNULLCMD(generalmente un localizador)).fuente
caty sólo tienen la cáscara leyó en directo:echo "$(<my_file.txt)".$(<filename).Además de otras respuestas, también puede intentar la redirección de entrada en lugar de
cato
$()y `` realizan lo mismo, ejecutan comandos dentro de su alcance y dan la salida al shell como si el usuario la hubiera dado como entrada. La única diferencia entre estos dos es que $ () puede ser recursivo y `` no puede ser recursivo.fuente
Respuesta simple: no puedes.
echo(ya sea shell incorporado o binario regular) no procesa su entrada estándar, es de una sola manera.fuente
Como se dijo
Por ejemplo, puede hacerlo así
xargs(teniendo en cuenta que necesita habilitar la interpretación de los escapes de barra invertida ):O simplemente lo que ha preguntado (sin interpretación de secuencias de escape ):
fuente
xargs echo(igual que porxargscierto,echoes el comando predeterminado), seechoejecutará el comando del sistema de archivos, no elechocomando incorporado del shell . También tenga en cuenta quexargsespera su entrada en un formato muy específico (donde los espacios en blanco, las nuevas líneas, las comillas y las barras invertidas tienen un significado especial).catno tiene mucho sentido aquí, ya que solo hay un archivo para concatenar (igual que< file.txt xargs echo. Tenga en cuenta que los que cumplen con Unixechohacen la expansión de escape de barra invertida de forma predeterminada y se-eecho -eEn bash, también debería funcionar lo siguiente:
La parte de los backticks se reemplaza por la salida de ese comando, es decir, en este caso se reemplaza por el contenido del archivo.
fuente
$( . . . ). Las personas que usan$()generalmente los prefieren porque puedes anidarlos. Sin embargo, esta pregunta es antigua, ¡es mucho más satisfactorio responder preguntas que aún no se han respondido!my_file.txtcontiene*, eso imprimiría la lista de nombres de archivo en el directorio actual.