我有一个 bash 脚本,我试图使用 read 将heredoc字符串分配给变量,并且只有当我read
与-d ''
选项一起使用时它才有效,即
read -d '' <variable>
脚本块
#!/usr/bin/env bash
function print_status() {
echo
echo "$1"
echo
}
read -d '' str <<- EOF
Setup nginx site-config
NOTE: if an /etc/nginx/sites-available config already exists for this
website, this routine will replace existing config with template from
this script.
EOF
print_status "$str"
我发现这个答案关于SO这是我复制命令的地方,它有效,但为什么呢?我知道第一次调用read
遇到第一个换行符时会停止,所以如果我使用一些未出现在字符串中的字符,整个heredoc都会被读入,例如
read -d '|' <variable>
-- 这有效read -d'' <variable>
——这不
read -d ''
我确信这很简单,但是这个命令选项是怎么回事?
答案1
我想问题是为什么read -d ''
行得通却read -d''
行不通。
这个问题与问题没有任何关系,read
但它是一个引用“问题”。""
作为字符串(单词)一部分的 /根本''
无法识别。让 shell 向您显示所看到/执行的内容:
start cmd:> set -x
start cmd:> echo read -d " " foo
+ echo read -d ' ' foo
start cmd:> echo read -d" " foo
+ echo read '-d ' foo
start cmd:> echo read -d "" foo
+ echo read -d '' foo
start cmd:> echo read -d"" foo
+ echo read -d foo
答案2
你的heredoc事情写得更简单,比如:
print_status(){ paste -sd\\n /dev/null - /dev/null;}
print_status <<\doc
doc body
doc
您不必将所有这些都分配给一个名称。就此而言,更简单的可能是:
print_status(){ printf %s\\n '' "$@" '';}
print_status \
'line 2' \
'line 3' and lines 4,5,6
我的观点是,我认为将一堆文本写入脚本文件,然后指示 shell 读取到临时文件有点过分(这通常是此处文档的工作方式)并在某些命令的标准输入上打开该临时文件(如果您的目标命令只是再次将其读回到变量中)!看?在我看来,这有点多余。