返回状态1,用于通过函数将Heredoc分配给变量

时间:2012-05-31 20:42:42

标签: bash shell variable-assignment

这是将here文档的内容分配给变量的一种方法。但是,它的执行将返回状态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()上面构建的任何文档。从哪里出错?

1 个答案:

答案 0 :(得分:3)

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

来自Bash Reference Manual

  

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

另外,请勿使用-e。使用显式错误处理。见BashFAQ/105

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