让Bash陷阱DEBUG将管道视为一个命令

时间:2016-04-24 13:39:00

标签: bash

我正在使用

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或管道行进行任何更改,以便将该行打印为一行吗?

2 个答案:

答案 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"