如何为Shell标准错误信息添加[error]前缀并完成重定向?
给Shell命令的错误信息添加[error]前缀
可以通过以下几种方式实现给错误信息添加[error]前缀的需求:
方法一:直接用进程替换处理单条命令
利用bash的进程替换功能,单独捕获标准错误并添加前缀后写入日志:
BACKUP_DIR="/home/backup/" BACKUP_LOG="/home/backup.log" echo "backup start" >> "$BACKUP_LOG" 2>&1 mkdir "$BACKUP_DIR" >> "$BACKUP_LOG" 2> >(sed 's/^/[error] /' >> "$BACKUP_LOG")
- 原理:将
mkdir的标准输出正常追加到日志,标准错误(fd2)导向sed进程,sed给每一行开头插入[error]后再写入日志。 - 注意:给变量
$BACKUP_DIR和$BACKUP_LOG加双引号,避免路径含空格时出现异常。
方法二:封装成复用函数
如果需要给多个命令添加错误前缀,可以封装一个通用函数:
# 定义日志函数:执行命令并给错误信息加前缀 log_with_error() { local log_file="$1" shift "$@" >> "$log_file" 2> >(sed 's/^/[error] /' >> "$log_file") } BACKUP_DIR="/home/backup/" BACKUP_LOG="/home/backup.log" echo "backup start" >> "$BACKUP_LOG" 2>&1 log_with_error "$BACKUP_LOG" mkdir "$BACKUP_DIR"
后续其他命令(如cp、tar等)都可以通过log_with_error "$BACKUP_LOG" 命令 参数的形式调用,统一处理错误输出。
方法三:POSIX兼容方案(无bash特性)
如果运行环境是POSIX标准Shell(不支持进程替换),可以用临时文件中转处理:
BACKUP_DIR="/home/backup/" BACKUP_LOG="/home/backup.log" # 创建临时文件存储错误信息 tmp_err=$(mktemp) echo "backup start" >> "$BACKUP_LOG" 2>&1 mkdir "$BACKUP_DIR" >> "$BACKUP_LOG" 2>"$tmp_err" # 如果临时文件非空,添加前缀后写入日志 if [ -s "$tmp_err" ]; then sed 's/^/[error] /' "$tmp_err" >> "$BACKUP_LOG" fi # 清理临时文件 rm "$tmp_err"
内容的提问来源于stack exchange,提问作者hanchao
相关产品推荐
相关产品推荐

