Bash脚本中read命令执行后异常退出(状态码1)求助
问题原因及解决方案
核心原因
read -d ''命令要求输入以**空字符(\0)**作为终止标记,但你使用的here-document(<<EOF)不会自动生成空字符,因此read会因找不到终止符返回状态码1。- 你的脚本大概率在前置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
相关产品推荐
相关产品推荐

