如何让Bash脚本执行命令时实现实时输出内容?
问题描述
我不太熟悉Bash脚本,请多包涵。我有一段如下脚本:
readarray -t lines < <($COMMAND) for line in "${lines[@]}"; do echo $line theLines+="$line " done
目前该脚本要等$COMMAND执行完毕才会输出内容到STDOUT,$COMMAND可以是ls -la、unzip等任意命令,请问如何实现命令输出的实时打印?
解决方案
原脚本的问题在于readarray会等待$COMMAND完全执行结束,将所有输出一次性读入数组后才开始循环处理,因此无法实时输出内容。要实现实时打印+收集输出到变量,可以改用while read逐行处理命令输出:
# 初始化存储输出的变量 theLines="" # 逐行读取$COMMAND的输出,实时打印并收集 $COMMAND | while IFS= read -r line; do # 实时打印当前行 echo "$line" # 将当前行追加到变量,保留换行符 theLines+="$line"$'\n' done
关键细节说明:
IFS= read -r line:IFS=确保读取的行开头/结尾的空格不会被截断;-r禁止将反斜杠视为转义字符,保证读取内容与原输出完全一致。
- 如果需要同时捕获
$COMMAND的错误输出(stderr),可以将命令改为:$COMMAND 2>&1 | while IFS= read -r line; do echo "$line" theLines+="$line"$'\n' done2>&1表示将stderr的内容重定向到stdout,这样错误信息也能实时打印并被收集到变量中。
额外说明:
如果不需要将输出收集到变量,直接执行$COMMAND即可实现实时打印——这是最直接的方式,只有当需要同时保存输出内容时,才需要用上述循环处理。
内容的提问来源于stack exchange,提问作者vaso123
相关产品推荐
相关产品推荐

