bash
的命令?我可以通过定义一个函数 cd()
来拦截特定的命令,例如 cd
,并且我也可以为其他命令一次拦截一个命令。但是我是否可以编写一个在每个命令执行之前调用的函数?我想对命令进行一些簿记,然后再执行命令。
Michał Šrajer 的想法 PS4='$(echo $(date) $(history 1) >> /tmp/trace.txt) TRACE: '
看起来非常有前途,但我得到了以下输出:$ ping www.google.com
TRACE: ping www.google.com
PING www.l.google.com (74.125.224.52) 56(84) bytes of data.
64 bytes from 74.125.224.52: icmp_seq=1 ttl=56 time=3.77 ms
64 bytes from 74.125.224.52: icmp_seq=2 ttl=56 time=2.33 ms
^C
--- www.l.google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 2.334/3.054/3.774/0.720 ms
TRACE: echo -ne '\033]0;myhost.com /home/yogeshwer/github/myproject\007'
TRACE: grep -e '\* '
TRACE: git branch
TRACE: sed 's/^..\(.*\)/ {\1}/'
在 /tmp/trace.txt 中确切地写入了 5 次: Wed Aug 3 12:47:27 PDT 2011 6672 ping www.google.com
, 其中另外四次来自我的 PS1
定义,其中我运行了以下命令: $(git branch 2> /dev/null | grep -e "\* " | sed "s/^..\(.*\)/ {\1}/")
。两个问题:
- 是否可能准确地将该命令写入到
/tmp/trace.txt
中? - 更重要的是,是否可能不混杂命令的输出,而只将命令写入到
/tmp/trace.txt
中?
我对能够在一个地方记录所有 bash 会话的命令的可能性感到非常兴奋!
.bash_history
不够用。PROMPT_COMMAND
在命令执行之前立即执行(我认为),但在PROMPT_COMMAND
执行时我无法访问“即将执行的命令”。完美的解决方案是获取“即将执行的下一个命令”,对其进行一些统计(例如已执行多少次),并将其写入某个日志文件,然后再执行该命令。 - Yogeshwer Sharma