我在用
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)
打印:
Run Code Online (Sandbox Code Playgroud)$ bzip2 -dc < dump.sql.bz2 $ mysql test
我可以trap
对管道或管道进行任何更改,以便将该行打印为一行吗?
将命令更改为:
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已执行,但我不知道如何控制此输出的格式。