此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))'
答案 0 :(得分:4)
错误来自未收到read
期待的分隔符。
read -d x variable <<<"hello"
如果我将输入更改为"hellox"
,则错误消失。
正如@Aserre所提到的,我们Unix & Linux sister site的详细分析正如@CharlesDuffy指出的那样,常见的解决方法是
read variable || [[ $variable ]]
即使没有-d
也可以用来处理可能缺少最终终止换行符的文件。