bash read返回退出代码1,即使它按预期运行

时间:2016-11-11 11:28:04

标签: linux bash

我有这个构造来初始化一个带有文件内容的变量:

echo "yyy" > xxx
read -r -d '' PAYLOAD <<< $(cat xxx)
echo $?
echo $PAYLOAD

这导致:

1
yyy

为什么读取返回1?这打破了我的脚本,因为我使用set -e

2 个答案:

答案 0 :(得分:3)

read返回1,因为只有在未遇到文件结束时才返回0

根据help read

Exit Status:
The return code is zero, unless end-of-file is encountered

您甚至不需要read,只需使用$(<file)将文件内容读入变量:

echo "yyy" > xxx
payload=$(<xxx)
echo $?
echo "$payload"

建议不要使用所有大写变量名,以避免与ENV变量发生冲突。

答案 1 :(得分:1)

实际上这里的正确答案是,在您的情况下,read 失败,因为它在 EOF 之前没有遇到分隔符。

因为您将分隔符设置为空字符串 (-d ''),所以 read 将无法找到它并以 1 退出。它仍然会读取所有内容,但它只会这样做,因为它找不到分隔符。这就是为什么它似乎有效,但似乎也失败了。

another 答案中提出的一个技巧是使用 while 循环/if 语句。所以像这样

if read -rd '' PAYLOAD; then :; fi <<< $(cat xxx)

或(更短)

if read -rd '' PAYLOAD; then :; fi < xxx

应该足以防止 shell 看到 read 命令的退出代码。

来源:https://unix.stackexchange.com/a/265151/44793