获取包含管道的最后一个bash命令

时间:2011-11-12 01:00:33

标签: bash tmux

我写了一个脚本,它使用$ 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,或者某种方式可以知道管道是否为用在最后一个命令中)?

1 个答案:

答案 0 :(得分:1)

我认为您需要更改一下您的实现并使用“history”命令才能使其正常工作。另外,使用命令“alias”检查所有已配置的别名。命令“which”检查命令是否实际存储在任何PATH目录中。祝你好运

相关问题