我编写了一个脚本,它使用 $BASH_COMMAND 检索当前运行的命令。该脚本基本上是在执行一些逻辑来确定每个 tmux 会话正在打开的当前命令和文件。一切都很好,除非用户运行管道命令(即cat file | less
),在这种情况下 $BASH_COMMAND 似乎只存储管道之前的第一个命令。结果,less[file]
脚本没有将命令显示为(这是打开文件的实际程序),而是将其输出为cat[file]
.
我尝试使用的一种替代方法是依赖history 1
而不是 $BASH_COMMAND。这种替代方案也存在一些问题。首先,它不会像 $BASH_COMMAND 那样自动扩展别名,这在某些情况下可能会导致脚本混淆(例如,如果我告诉它忽略ls
,而是使用ll
(映射到ls -l
),则脚本不会忽略命令,无论如何都要处理它),并为每个别名包含额外的条件似乎不是一个干净的解决方案。第二个问题是我正在使用 HISTIGNORE 过滤掉一些我仍然希望脚本知道的常用命令,使用历史只会使脚本忽略最后一个命令,除非它被历史跟踪。
我还尝试使用${#PIPESTATUS[@]}
来查看数组长度是否为 1(无管道)或更高(使用管道,在这种情况下我将检索历史记录),但它似乎总是只知道 1 个命令。
是否有人知道可能对我有用的其他替代方案(例如另一个变量,它将存储 $BASH_COMMAND 以用于在当前子调用完成后执行的其他子调用,或者以某种方式知道管道是否用于最后一个命令)?