You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本中read命令执行后异常退出(状态码1)求助

问题原因及解决方案

核心原因

  1. read -d '' 命令要求输入以**空字符(\0)**作为终止标记,但你使用的here-document(<<EOF)不会自动生成空字符,因此read会因找不到终止符返回状态码1。
  2. 你的脚本大概率在前置setup代码中开启了set -e(errexit模式)——该模式会让脚本在任意命令返回非0状态时直接退出,所以read失败后脚本直接终止,无法执行后续代码。

解决方案

方案一:直接变量赋值(推荐,更简洁可靠)

无需使用read,bash支持直接多行赋值字符串:

test_command="CI_TIMEOUT_MINUTES=20 \
FOO=foo \
BAR=${bar} \
yarn test \"path/to/tests/\""

注意:外层用双引号包裹时,原字符串中的双引号需要转义为\",避免解析错误。

方案二:忽略read的错误状态

如果必须保留read写法,可在命令后追加|| true,强制让命令返回0状态,避免触发set -e的退出机制:

read -r -d '' test_command <<EOF || true
CI_TIMEOUT_MINUTES=20 \
FOO=foo \
BAR=${bar} \
yarn test "path/to/tests/"
EOF

方案三:临时关闭errexit模式

在read执行前后分别关闭、重新开启set -e:

set +e
read -r -d '' test_command <<EOF
CI_TIMEOUT_MINUTES=20 \
FOO=foo \
BAR=${bar} \
yarn test "path/to/tests/"
EOF
set -e

额外注意

后续执行kubectl exec ... -c "${test_command}"时,可能会出现引号解析问题(比如原字符串中的"path/to/tests/"在变量展开后丢失引号)。如果路径包含空格或特殊字符,建议改用here-string传递命令:

if ! kubectl exec -it "$pod" -- /bin/sh -c "$(cat <<EOF
CI_TIMEOUT_MINUTES=20
FOO=foo
BAR=${bar}
yarn test "path/to/tests/"
EOF
)"; then
# ...
fi

内容的提问来源于stack exchange,提问作者beni0888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:10:23