如何在Bash脚本中显示rsync的运行输出及进度
rsync实时进度显示问题解决
修正原脚本语法错误
原脚本中rsync ... | exit 1)是语法错误,|为管道符号,此处需用||(逻辑或)实现「rsync执行失败则退出脚本」的逻辑,修正后基础脚本如下:
# Copy the file over echo "* Downloading: ${TARGET_FILE_NAME}" rsync -vh --progress --stats "$TARGET_FILE_PATH" "$USER_PATH" || exit 1 echo "* Downloading Complete"
核心解决:实时显示进度
rsync的--progress实时进度信息默认输出到标准错误(stderr),终端默认仅显示标准输出(stdout),因此需将stderr重定向到stdout,让进度信息直接显示:
rsync -vh --progress --stats "$TARGET_FILE_PATH" "$USER_PATH" 2>&1 || exit 1
修改后即可实时看到rsync的进度条、传输速度、已传输字节数等信息。
逐行处理输出的实时显示方案
若需对rsync输出做自定义处理(比如添加前缀),之前的while read方法因管道全缓冲机制,导致所有输出在rsync完成后才一次性显示。可通过stdbuf强制rsync使用行缓冲,实现实时输出:
echo "* Downloading: ${TARGET_FILE_NAME}" stdbuf -oL -eL rsync -vh --progress --stats "$TARGET_FILE_PATH" "$USER_PATH" | while IFS= read -r line; do echo " $line" done || exit 1 echo "* Downloading Complete"
stdbuf -oL设置标准输出为行缓冲,-eL设置标准错误为行缓冲,确保每一行输出都能被实时处理并显示。
之前尝试失败的原因说明
2>&1语法错误:若之前将2>&1放在管道之后(如rsync ... | 2>&1),属于语法误用,正确位置应紧跟rsync命令。--log-file=/dev/stdout无效:rsync的--log-file仅记录传输文件列表等日志信息,不包含--progress的实时进度条,因此无输出。- 管道缓冲问题:bash管道默认采用全缓冲,只有缓冲区满或命令结束时才会输出内容,导致
while read需等待rsync完成才显示所有内容。
内容的提问来源于stack exchange,提问作者Alberto Lerdo
相关产品推荐
相关产品推荐

