我总是这样做将文本附加到文件中
echo "text text text ..." >> file
# or
printf "%s\n" "text text text ..." >> file
我想知道是否有更多的方法可以实现相同的、更优雅或更不寻常的方式。
答案1
我非常喜欢这个,我可以在脚本的顶部设置一个日志文件并在整个过程中写入它,而不需要全局变量或记住更改文件名的所有出现:
exec 3>> /tmp/somefile.log
...
echo "This is a log message" >&3
echo "This goes to stdout"
echo "This is written to stderr" >&2
该exec 3>dest
构造打开文件dest
进行写入(用于>>
追加、<
用于读取 - 就像平常一样)并将其附加到文件描述符#3。然后你得到描述符#1标准输出, #2 为标准错误,以及该文件的新#3 dest
。
您可以加入标准错误到标准输出在具有诸如exec 2>&1
- 之类的构造的脚本的持续时间内,存在许多强大的可能性。文档 ( man bash
) 对此有这样的说法:
exec [-cl] [-a name] [command [arguments]]
如果command
指定,它将替换外壳。 [...]如果command
未指定,任何重定向都会在当前 shell 中生效 [...]。
答案2
以下是将文本附加到文件的其他几种方法。
使用 T 恤
tee -a file <<< "text text text ..."
使用 awk
awk 'BEGIN{ printf "text text text ..." >> "file" }'
使用 sed
sed -i '$a text text text ...' file sed -i -e "\$atext text text ..." file
资料来源:
答案3
用一个here-document
方法:
cat <<EOF >> file
> foo
> bar
> baz
> EOF
测试:
$ cat file
aaaa
bbbb
$ cat <<EOF >> file
> foo
> bar
> baz
> EOF
$ cat file
aaaa
bbbb
foo
bar
baz
答案4
使用 Unix 文件编辑器。两者GNU
和BSD
版本。
ed(1)
与使用printf
printf '%s\n' '$a' 'foo bar baz' . w | ed -s file.txt
bash 特定但更神秘的语法,使用$' '
shell 引用和herestring
ed -s file.txt <<< $'$a\nfoo bar baz\n.\nw'
ex(1)
与使用printf
printf '%s\n' '$a' 'foo bar baz' . x | ex -s file.txt
bash 特定但更神秘的语法$' '
shell 引用和herestring
ex -s file.txt <<< $'$a\nfoo bar baz\n.\nx'