如何获取/保存Bash中eval即将执行的最终命令行字符串
获取eval执行的最终Bash命令行字符串
下面提供两种可行的方法来捕获eval展开后实际执行的命令行字符串:
方法一:利用DEBUG陷阱和BASH_COMMAND变量
Bash的DEBUG陷阱会在每个命令执行前触发,BASH_COMMAND变量则会保存即将执行的命令内容,包括eval展开后的最终命令。
# 设置DEBUG陷阱,将即将执行的命令存入last_cmd变量 trap 'last_cmd=$BASH_COMMAND' DEBUG # 执行目标eval命令 cmd=ls; f=package.o ; eval $cmd $f # 关闭DEBUG陷阱,避免影响后续脚本 trap - DEBUG # 输出捕获到的最终命令 echo "最终执行的命令:$last_cmd"
执行后会输出:最终执行的命令:ls package.o
方法二:捕获xtrace输出提取命令
如果依赖set -x的输出逻辑,可以捕获xtrace的内容并提取目标行:
cmd=ls; f=package.o # 开启xtrace执行eval,捕获stderr输出(xtrace内容),同时丢弃正常输出 xtrace_log=$(set -x; eval $cmd $f 2>&1 >/dev/null) # 提取以++开头的行,去掉前缀和开头空格 final_command=$(echo "$xtrace_log" | grep '^++' | sed 's/^++ //') # 输出结果 echo "最终执行的命令:$final_command"
注意事项
- 如果eval展开后包含多个命令(比如用分号分隔),第一种方法的
last_cmd会只保留最后一个执行的命令;第二种方法需要调整提取逻辑来捕获所有行。 - 复杂场景(如管道、子shell)下,
BASH_COMMAND的内容可能会有变化,需要根据实际情况调整。
内容的提问来源于stack exchange,提问作者user17227456
相关产品推荐
相关产品推荐

