Bash 带有反斜杠的 herefile 在 ubuntu 18.04 和 20.04 上有不同的结果?
Bash herefile with backslash different result on ubuntu 18.04 and 20.04?
我想将更长的文本放入 shellscript 变量中,并使用 herefile 和反斜杠,如下例所示。我看到 ubuntu 18.04 和 ubuntu 20.04 有不同的行为(都使用 /bin/bash, utf-8:
param="$(cat <<'EOF'
a\
b
EOF
)"
echo $param > ./testfile.txt
ubuntu 18.04 上的输出 (cat ./testfile.txt):
ab
ubuntu 20.04 上的输出:
a\ b
为什么输出不同?
PS:使用 EOF 而不是 'EOF' 两个版本的输出都是:
ab
这是 5.0 版中的错误修复:
kk. Fixed a bug that caused bash to remove backslash-newline pairs from the
body of a here-document with a quoted delimiter inside a command
substitution.
在 4.4 中,它被删除了,因此 cat
在其输入中看到 a
和 b
紧邻。现在,它们被保留了下来,但是反斜杠在 param
的值中是一个文字字符,并且在 word-splitting 期间丢弃了后面的换行符,所以单词 a\
和 b
由 echo
输出,由单个 space.
分隔
如果你引用 $param
,你会看到换行符。
$ echo "$param"
a\
b
我想将更长的文本放入 shellscript 变量中,并使用 herefile 和反斜杠,如下例所示。我看到 ubuntu 18.04 和 ubuntu 20.04 有不同的行为(都使用 /bin/bash, utf-8:
param="$(cat <<'EOF'
a\
b
EOF
)"
echo $param > ./testfile.txt
ubuntu 18.04 上的输出 (cat ./testfile.txt):
ab
ubuntu 20.04 上的输出:
a\ b
为什么输出不同?
PS:使用 EOF 而不是 'EOF' 两个版本的输出都是:
ab
这是 5.0 版中的错误修复:
kk. Fixed a bug that caused bash to remove backslash-newline pairs from the body of a here-document with a quoted delimiter inside a command substitution.
在 4.4 中,它被删除了,因此 cat
在其输入中看到 a
和 b
紧邻。现在,它们被保留了下来,但是反斜杠在 param
的值中是一个文字字符,并且在 word-splitting 期间丢弃了后面的换行符,所以单词 a\
和 b
由 echo
输出,由单个 space.
如果你引用 $param
,你会看到换行符。
$ echo "$param"
a\
b