Tengo un archivo llamado my_file.txt
cuyo 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
echo
pero no hará nada con él.echo
no 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 algunasecho
implementaciones con algunas secuencias de escape en ellas expandidas y / o argumentos comenzando con-
posiblemente tratados como opciones).Si desea
echo
mostrar 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 esecat
comando, yecho
añ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.yash
también eliminará los bytes que no forman parte de los caracteres válidos.Si la razón para querer hacer eso es porque quiere
echo
ampliar el\n
,\b
,\0351
... secuencias de escape en el archivo (como UNIX conformesecho
implementaciones hacen, pero no en todos ), entonces prefiere utilizarprintf
en 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
,zsh
ybash
, también se puede hacer:$(<file)
. Es un operador especial mediante el cual el shell , en lugar decat
leer, 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
. Enbash
eso 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
cat
y 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
cat
o
$()
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 porxargs
cierto,echo
es el comando predeterminado), seecho
ejecutará el comando del sistema de archivos, no elecho
comando incorporado del shell . También tenga en cuenta quexargs
espera 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).cat
no 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 Unixecho
hacen la expansión de escape de barra invertida de forma predeterminada y se-e
echo -e
En 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.txt
contiene*
, eso imprimiría la lista de nombres de archivo en el directorio actual.