我正在使用
trap 'echo -e "\e[92m$ $BASH_COMMAND\e[0m"' DEBUG
在Bash脚本中打印每个执行的命令。
这很好用,除了它在我将它们一起管道时打印两个命令:
bzip2 -dc < dump.sql.bz2 | mysql test
打印:
$ bzip2 -dc < dump.sql.bz2 $ mysql test
我可以对trap
或管道行进行任何更改,以便将该行打印为一行吗?
答案 0 :(得分:2)
将您的命令更改为:
mysql test < <(bzip2 -dc < dump.sql.bz2)
使用process substitution代替管道,从Bash的角度来看,命令是一个简单命令,这是DEBUG
陷阱的粒度级别并且内置的$BASH_COMMAND
变量可以运行。
<强>背景强>:
设计中的DEBUG
(伪)信号在简单命令的级别上运行,$BASH_COMMAND
也是如此。
bzip2 -dc < dump.sql.bz2 | mysql test
是多个简单命令的管道 。
因此,您的trap
语句无法通过管道执行您想要的操作。
使用复合命令(例如,while
循环或命令组({ ...; ...; }
)或命令列表获得所需内容最接近(与操作符; && || &
连接的简单命令或管道)是使用set -v
,它在执行之前将整个命令回显到 stderr ,但我不会# 39;知道如何控制此输出的格式。
答案 1 :(得分:1)
粗略的解决方法是使用一个函数,如下所示:
run () { eval $1; }
trap 'echo -e "\e[92m$ $BASH_COMMAND\e[0m"' DEBUG
run "bzip2 -dc < dump.sql.bz2 | mysql test"
输出:
$ run "bzip2 -dc < dump.sql.bz2 | mysql test"