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

And*_*eKR 5 bash

我在用

trap 'echo -e "\e[92m$ $BASH_COMMAND\e[0m"' DEBUG
Run Code Online (Sandbox Code Playgroud)

在Bash脚本中打印每个执行的命令.

这工作正常,只是当我将它们一起管道时它会打印两个命令:

bzip2 -dc < dump.sql.bz2 | mysql test
Run Code Online (Sandbox Code Playgroud)

打印:

$ bzip2 -dc < dump.sql.bz2
$ mysql test
Run Code Online (Sandbox Code Playgroud)

我可以trap对管道或管道进行任何更改,以便将该行打印为一行吗?

mkl*_*nt0 3

将命令更改为:

mysql test < <(bzip2 -dc < dump.sql.bz2)
Run Code Online (Sandbox Code Playgroud)

从 Bash 的角度来看,使用进程替换而不是管道使该命令成为一个简单的DEBUG命令,这是陷阱和内置变量操作的粒度级别$BASH_COMMAND

背景

(伪)信号按照设计在简单DEBUG命令级别上运行,就像 一样。$BASH_COMMAND

bzip2 -dc < dump.sql.bz2 | mysql test是由 多个简单命令组成的管道。

因此,您的语句无法使用pipelinetrap执行您想要的操作。

使用复合命令(例如,while循环或命令组 ( { ...; ...; }) 或命令列表(简单命令或与运算符连接的管道))最接近获得所需内容的; && || &是 use ,它在执行之前set -v将整个命令回显到stderr已执行,但我不知道如何控制此输出的格式