我如何在这里写一个文档到Bash脚本文件?
当前回答
使用tee代替cat和I/O重定向可能会有用:
tee newfile <<EOF
line 1
line 2
line 3
EOF
它更简洁,而且与重定向操作符不同,如果您需要以根权限写入文件,它可以与sudo结合使用。
其他回答
我喜欢这种方法,因为它简洁、易读,而且在缩进的脚本中表现得很好:
<<-End_of_file >file
→ foo bar
End_of_file
其中→为制表符。
使用tee代替cat和I/O重定向可能会有用:
tee newfile <<EOF
line 1
line 2
line 3
EOF
它更简洁,而且与重定向操作符不同,如果您需要以根权限写入文件,它可以与sudo结合使用。
当需要root权限时
当目标文件需要root权限时,使用|sudo tee而不是>:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
cat << "EOF" |sudo tee /tmp/yourprotectedfilehere
The variable $FOO *will* be interpreted.
EOF
对于那些寻找纯bash解决方案(或需要速度)的人来说,这里有一个简单的解决方案,没有cat:
# here-doc tab indented
{ read -r -d '' || printf >file '%s' "$REPLY"; } <<-EOF
foo bar
EOF
或简单的“mycat”函数(并避免在环境中留下REPLY):
mycat() {
local REPLY
read -r -d '' || printf '%s' "$REPLY"
}
mycat >file <<-EOF
foo bar
EOF
快速比较“mycat”vs OS cat(1000循环>/dev/null在我的OSX笔记本电脑上):
mycat:
real 0m1.507s
user 0m0.108s
sys 0m0.488s
OS cat:
real 0m4.082s
user 0m0.716s
sys 0m1.808s
注意:mycat不处理文件参数,它只处理“将heredoc写入文件”的问题。
根据@Livven的回答,这里有一些有用的组合。
variable substitution, leading tab retained, overwrite file, echo to stdout tee /path/to/file <<EOF ${variable} EOF no variable substitution, leading tab retained, overwrite file, echo to stdout tee /path/to/file <<'EOF' ${variable} EOF variable substitution, leading tab removed, overwrite file, echo to stdout tee /path/to/file <<-EOF ${variable} EOF variable substitution, leading tab retained, append to file, echo to stdout tee -a /path/to/file <<EOF ${variable} EOF variable substitution, leading tab retained, overwrite file, no echo to stdout tee /path/to/file <<EOF >/dev/null ${variable} EOF the above can be combined with sudo as well sudo -u USER tee /path/to/file <<EOF ${variable} EOF