如何将被调用Shell脚本的echo输出传入调用脚本的日志方法参数
让script_2的输出通过script_1的log方法写入日志
首先得明确:你想直接用log(/path/to/script_2)这种方式是行不通的——log是个Shell函数,它接收的是字符串参数,这么写只会把脚本路径作为文本写入日志,根本不会执行脚本并捕获它的输出。
下面给你几个实用的可行方案,按需选择:
方案1:逐行捕获script_2输出并写入日志
这是最贴合你现有log方法使用习惯的方式,能把script_2的每一行输出都单独调用log写入日志:
在script_1里把调用script_2的代码替换成:
# 捕获script_2的标准输出,逐行传给log函数 /path/to/script_2 | while read -r line; do log "$line" done
这里用管道将script_2的标准输出导向while循环,read -r line会逐行读取输出内容,然后调用log把每行内容写入日志文件,和script_1本身的日志格式保持一致。
方案2:一次性捕获所有输出写入日志
如果script_2的输出内容不多,不需要逐行处理,也可以一次性捕获全部输出后传给log:
# 捕获script_2的所有输出(包括换行符) script_output=$(/path/to/script_2) # 把捕获到的内容传给log写入 log "$script_output"
注意这里必须用双引号包裹$script_output,这样才能保留输出里的换行符,避免所有内容被挤成一行。
方案3:让script_2直接调用script_1的log函数(需修改script_2)
如果允许修改script_2的代码,可以让它在script_1的环境中运行,从而直接使用log函数:
- 先在script_1里把调用方式从直接执行改成
source:
# 用source让script_2在当前Shell环境运行,能直接访问log函数和变量 source /path/to/script_2
- 然后修改script_2里的echo语句,换成调用
log:
#!/bin/sh log "This is logging from script 2"
这个方案的好处是script_2的日志逻辑和script_1完全统一,但缺点是script_2会依赖script_1的环境,无法单独运行(除非你也在script_2里单独定义log函数)。
总结一下:如果不想修改script_2,优先选方案1;如果script_2输出量小,方案2更简洁;如果可以修改script_2且希望日志逻辑统一,方案3是不错的选择。
内容的提问来源于stack exchange,提问作者TheWaterProgrammer
相关产品推荐
相关产品推荐

