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

通过标准输入执行含Gradle任务的Shell脚本时流程中断问题

问题原因

当脚本通过管道(比如cat script.sh | bash -s)执行时,Gradle默认会从标准输入(stdin)读取数据,这会把gradle clean之后的脚本内容(也就是echo Bye)直接消耗掉,bash没机会读到后续命令,所以执行完Gradle就直接结束了——返回码0是因为Gradle本身执行成功,但后续的echo Bye根本没被执行。

简洁解决方案

这里有几种不用嵌套管道的解决办法:

办法1:让Gradle不读取标准输入

修改脚本里的Gradle命令,把它的标准输入重定向到/dev/null:

#!/bin/bash

echo Hello
gradle clean < /dev/null
echo Bye

这样Gradle不会去读管道里的脚本内容,bash就能正常执行后续命令。

办法2:使用Gradle的非交互参数

给Gradle加--no-interactive参数,强制它运行在非交互模式,不会尝试读取标准输入:

#!/bin/bash

echo Hello
gradle clean --no-interactive
echo Bye

办法3:调用bash时指定输入源

如果不想修改脚本,在调用bash的时候,把它的标准输入指向/dev/null:

# cat调用的场景
cat script.sh | bash -s </dev/null

# curl调用的场景
curl -so- http://host/script.sh | bash -s </dev/null

这样Gradle就算想读stdin,也只会读到空内容,不会影响脚本后续命令的执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:04:57