linux – Bash(或其他shell):用函数/脚本包装所有命令

编辑:这个问题最初是针对特定的.我仍然宁愿有一个bash解决方案,但如果有一个很好的方法在另一个 shell中执行此操作,那么这也是有用的知识!

好的,问题的顶级描述.我希望能够为bash添加一个钩子,当用户输入时,例如$cat foo | sort -n |更少,这被拦截并翻译成包装’cat foo | sort -n |减’.我已经看到了在每个命令之前和之后运行命令的方法(使用DEBUG陷阱或PROMPT_COMMAND或类似命令),但没有关于如何拦截每个命令并允许它由另一个进程处理的方法.有没有办法做到这一点?

为了解释我为什么要这样做,以防人们有其他方法来处理它:

script这样的工具可以让您将在终端中执行的所有操作记录到日志中(在某种程度上,可以记录bash历史记录).然而,他们做得不是很好 – 脚本将输入与输出混合成一个大字符串,并与诸如vi等接管屏幕的应用程序混淆,历史记录只给出输入的原始命令,并且它们都不起作用好吧,如果您同时输入多个终端的命令.我想要做的是捕获更丰富的信息 – 例如,命令,执行的时间,完成的时间,退出状态,stdin和stdout的前几行.我也更喜欢将它发送到一个可以愉快地复用多个终端的监听守护进程.执行此操作的简单方法是将命令传递给另一个程序,该程序可以执行shell以处理作为子进程的命令,同时获取stdin,stdout,退出状态等的句柄.可以写一个shell来执行此操作,但是你’ d失去了bash中的大部分功能,这会很烦人.

这样做的动机来自于试图理解探索性数据分析,就像事后的程序一样.有了这样更丰富的信息,就可以生成关于发生的事情的正确报告,将一个命令的多个调用压缩到一个命令,其中前几个命令给出非零退出,通过搜索触及文件的所有内容来询问文件来自何处,等等

解决方法

运行此bash脚本:
#!/bin/bash
while read -e line
do
    wrapper "$line"
done

在最简单的形式中,包装器可以包含eval“$LINE”.你提到想要有时间,所以也许有时间评估“$line”.你想捕获退出状态,所以这应该是行save = $?.而且,你想捕获stdout的前几行,所以一些重定向是有序的.等等.

更多:Jo So建议包含对多行bash命令的处理.在最简单的形式中,如果eval返回“语法错误:意外的文件结束”,那么您希望在继续之前提示输入另一行.更好的是,要检查正确的bash命令,请在执行eval之前运行bash -n<<<“$line”.如果bash -n报告行尾错误,则提示输入更多内容以添加到“$line”.等等.

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...