1

这是将此处文档的内容分配给变量的一种方法。但是,它的执行将返回状态 1 而没有说明原因。

#! /bin/bash
# set -e -x

# This implementation returns 1
define(){ IFS='\n'; read -r -d '' ${1}; }
define thedoc <<'EOF'
Here is my here doc.
There was an ASCII banana here too,
but `read` would just it concatenate to mush.
EOF
# The here document will print with the following when `set -e` in not invoked.
echo $thedoc

set -e如果关闭,一切都通过检查甚至执行来检查。这不是上面的 Banana 独有的,而是define()上面构建的任何此处的文档。该错误从何而来?

4

1 回答 1

3

当您使用空字符串作为分隔符时,read它基本上永远不会看到分隔符并遇到文件结尾,因此它将返回状态设置为 1。您可以使用while read循环来避免这种情况。

来自Bash 参考手册

返回代码为零,除非遇到文件结尾、read超时(在这种情况下返回代码大于 128),或者提供了无效的文件描述符作为 ' -u' 的参数。

另外,不要使用-e. 使用显式错误处理。见BashFAQ/105

此外,为了保留空格、制表符和换行符而不是“连接成糊状”,您必须引用变量 you echo

于 2012-05-31T23:57:02.897 回答