我有这个构造来初始化一个带有文件内容的变量:
echo "yyy" > xxx
read -r -d '' PAYLOAD <<< $(cat xxx)
echo $?
echo $PAYLOAD
这导致:
1
yyy
为什么读取返回1?这打破了我的脚本,因为我使用set -e
。
答案 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
命令的退出代码。