I have a file named my_file.txt
whose content is just the string Hello
. How could I redirect its content to the command echo
?
I know I have the commands less
, cat
, more
… but I need to do it with echo
.
I tried this:
$ cat my_file.txt | echo
and also this:
$ echo < my_file.txt
But in both cases it appears only a blank in the stdout, not the content of my_file.txt.
How could I do that?
Best Answer
You can redirect all you want to
echo
but it won't do anything with it.echo
doesn't read its standard input. All it does is write to standard output its arguments separated by a space character and terminated by a newline character (and with someecho
implementations with some escape sequences in them expanded and/or arguments starting with-
possibly treated as options).If you want
echo
to display the content of a file, you have to pass that content as an argument toecho
. Something like:Note that
$(...)
strips the trailing newline characters from the output of thatcat
command, andecho
adds one back.Also note that except with
zsh
, you can't pass NUL characters in the arguments of a command, so that above will typically not work with binary files.yash
will also remove bytes that don't form part of valid characters.If the reason for wanting to do that is because you want
echo
to expand the\n
,\b
,\0351
... escape sequences in the file (as UNIX conformantecho
implementations do, but not all), then you'd rather useprintf
instead:Contrary to
echo
, that one is portable and won't have problems if the content of the file starts with-
.As an alternative to
$(cat file)
, withksh
,zsh
andbash
, one can also do:$(<file)
. That's a special operator whereby the shell as opposed tocat
reads the content of the file to make up the expansion. It still strips the trailing newlines and chokes on NUL bytes except inzsh
. Inbash
, that still forks an extra process. Also note that one difference is that you won't get any error if trying to read a file of type directory that way. Also, while$(< file)
is special,$(< file; other command)
is not (inzsh
, when not emulating other shell, that would still expand the content of thefile
, by running the implicit$READNULLCMD
command (typically a pager)).