管道传给bash执行的shell脚本中apt-get后续命令未正常执行如何解决
问题原因
当通过管道将脚本内容传给bash执行时,bash的标准输入就是管道传输的脚本数据流,bash会逐行读取内容作为命令执行。而apt-get命令默认会继承当前shell的标准输入,在运行过程中会主动读取标准输入中的内容,导致脚本里apt-get之后的行被apt-get读取消费,而没有被bash识别为后续要执行的命令,就会出现你观察到的剩余脚本内容被异常打印、不执行的问题。
解决方法
以下是几种可行的解决方案:
- 方案1:修改脚本,给
apt-get命令显式重定向标准输入到/dev/null,阻止它读取管道中的脚本内容
修改后的脚本如下:
echo Step one... apt-get install -y --reinstall ca-certificates < /dev/null echo Step two...
修改后再执行cat script.sh | bash即可正常按顺序执行所有命令。
- 方案2:如果不方便修改原脚本,可以在执行时调整命令,让bash先把所有脚本内容读取完再执行:
bash -c "$(cat script.sh)"
这个方案是先把整个脚本内容读取为字符串传给bash执行,避免运行过程中apt-get从管道读取剩余内容。
- 方案3:给apt-get添加禁止交互参数,配合重定向兼容性更好:
apt-get install -y --noninteractive --reinstall ca-certificates < /dev/null
内容的提问来源于stack exchange,提问作者draca
相关产品推荐
相关产品推荐

