通过标准输入执行含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
相关产品推荐
相关产品推荐

