为什么read会在bash中抛出错误但工作正常?

时间:2018-02-15 13:18:13

标签: linux bash shell unix ifs

此bash脚本将数组写入文件,然后将文件读回另一个数组。 (这对于脚本之间基于阵列的通信很有用。)但是,IFS行(第12行)会捕获一个奇怪的,未报告的错误。的 为什么?

#!/bin/bash

# eso-error-ic

trap 'echo Error trapped, with code $?, on line ${LINENO}' ERR

# write data to a file
arr=(0 abc) && printf "%s\n" "${arr[@]}" > eso.out

# read data from the file into an array
# throws an error!!
IFS=$'\n' read -d '' -a new_arr < eso.out

# but it worked...
echo ${new_arr[0]}
echo ${new_arr[1]}

脚本输出:

Error trapped, with code 1, on line 12
0
abc

缺少的是生成错误时显示的任何类型的消息。所有你得到的是来自陷阱的消息,但没有关于 错误 的消息。

换句话说,IFS /读取行产生错误,该错误被捕获,但没有显示错误消息,并且该行正确地将文件读入数组变量。它有效,报告没有错误,但是错误&#34;陷入困境。

如果注释掉陷阱行或切换到命令/ eval / cat方法将文件读入数组(如建议here),则不会捕获错误。以下是此脚本的命令/ eval / cat行(替换第12行):

IFS=$'\n' GLOBIGNORE='*' command eval 'new_arr=($(cat eso.out))'

1 个答案:

答案 0 :(得分:4)

错误来自未收到read期待的分隔符。

我也一样
read -d x variable <<<"hello"

如果我将输入更改为"hellox",则错误消失。

正如@Aserre所提到的,我们Unix & Linux sister site的详细分析正如@CharlesDuffy指出的那样,常见的解决方法是

read variable || [[ $variable ]]

即使没有-d也可以用来处理可能缺少最终终止换行符的文件。