bash 读取的 -d 选项如何工作?

bash 读取的 -d 选项如何工作?

我有一个 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 读取到临时文件有点过分(这通常是此处文档的工作方式)并在某些命令的标准输入上打开该临时文件(如果您的目标命令只是再次将其读回到变量中)!看?在我看来,这有点多余。

相关内容