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 algunas echoimplementaciones 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 a echo. Algo como:
echo "$(cat my_file.txt)"
Tenga en cuenta que $(...)despoja al carácter de nueva línea de arrastre s de la salida de ese catcomando, y echoañ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 conformes echoimplementaciones hacen, pero no en todos ), entonces prefiere utilizar printfen su lugar :
printf '%b\n' "$(cat my_file.txt)"
Al contrario echo, ese es portátil y no tendrá problemas si el contenido del archivo comienza con -.
Como alternativa a $(cat file), con ksh, zshy bash, también se puede hacer:$(<file) . Es un operador especial mediante el cual el shell , en lugar de catleer, lee el contenido del archivo para completar la expansión. Todavía despoja las líneas nuevas y chokes finales en bytes NUL excepto en zsh. En basheso 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 (en zsh, cuando no se emula a otro shell, eso aún expandiría el contenido del file, ejecutando el comando implícito $READNULLCMD (generalmente un localizador)).
echo?