I always do this to append text to a file
echo "text text text ..." >> file
# or
printf "%s\n" "text text text ..." >> file
I wonder if there are more ways to achieve the same, more elegant or unusual way.
I always do this to append text to a file
echo "text text text ..." >> file
# or
printf "%s\n" "text text text ..." >> file
I wonder if there are more ways to achieve the same, more elegant or unusual way.
I quite like this one, where I can set up a log file at the top of a script and write to it throughout without needing either a global variable or to remember to change all occurrences of a filename:
exec 3>> /tmp/somefile.log
...
echo "This is a log message" >&3
echo "This goes to stdout"
echo "This is written to stderr" >&2
The exec 3>dest construct opens the file dest for writing (use >> for appending, < for reading - just as usual) and attaches it to file descriptor #3. You then get descriptor #1 for stdout, #2 for stderr, and this new #3 for the file dest.
You can join stderr to stdout for the duration of a script with a construct such as exec 2>&1 - there are lots of powerful possibilities. The documentation (man bash) has this to say about it:
exec [-cl] [-a name] [command [arguments]]Ifcommandis specified, it replaces the shell. [...] Ifcommandis not specified, any redirections take effect in the current shell [...].
Here are few other ways to append text to a file.
Using tee
tee -a file <<< "text text text ..."
Using awk
awk 'BEGIN{ printf "text text text ..." >> "file" }'
Using sed
sed -i '$a text text text ...' file
sed -i -e "\$atext text text ..." file
Sources:
Using a here-document approach:
cat <<EOF >> file
> foo
> bar
> baz
> EOF
Tests:
$ cat file
aaaa
bbbb
$ cat <<EOF >> file
> foo
> bar
> baz
> EOF
$ cat file
aaaa
bbbb
foo
bar
baz
See dd(1) man page:
dd conv=notrunc oflags=append bs=4096 if=myNewData of=myOldFile
Using the Unix file editors. Both GNU and BSD version.
Using ed(1) with printf
printf '%s\n' '$a' 'foo bar baz' . w | ed -s file.txt
The bash specific but more cryptic syntax using the $' ' shell quoting and a herestring
ed -s file.txt <<< $'$a\nfoo bar baz\n.\nw'
Using ex(1) with printf
printf '%s\n' '$a' 'foo bar baz' . x | ex -s file.txt
The bash specific but more cryptic syntax $' ' shell quoting and a herestring
ex -s file.txt <<< $'$a\nfoo bar baz\n.\nx'
cat >> file
first line
second line
...
last line
Hit Enter at the last line then Ctrl + D.