2011-08-03 40 views
7

有没有办法拦截给bash的每个命令?我可以通过定义一个函数cd()来拦截一个特定的命令,例如cd,我也可以为其他命令一次执行一个命令。但是我可以编写一个函数,在每个命令执行之前被调用吗?我想做一些记录的命令,然后执行命令。bash:如何拦截每个命令

米哈尔Š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}/' 

而且Wed Aug 3 12:47:27 PDT 2011 6672 ping www.google.com被写入在/tmp/trace.txt整整5倍。其他四个来自我的定义PS1,我运行以下命令:$(git branch 2> /dev/null | grep -e "\* " | sed "s/^..\(.*\)/ {\1}/")。两个问题:

  • 是否可以正确地将命令写入/tmp/trace.txt
  • 更重要的是,是否有可能不混乱命令的输出,但只写入命令/tmp/trace.txt

我很高兴能够在一个地方记录我所有bash会话中的命令的可能性!

+0

'.bash_history'不足以满足您的需求,我接受它吗? – Andrew

+0

请注意,'.bash_history'仅在shell退出时更新。 –

+0

PROMPT_COMMAND呢? –

回答

1

不确定是否拦截每个命令,但在某些版本的Linux中,每个命令都记录到〜/ .bash_history。你可以弄清楚它是如何工作的,或者只是解析该文件以查看最后的命令。

4

$PROMPT_COMMAND(如果设置)包含打印提示前执行的命令($PS1)。将其设置为捕获history 1输出的函数的名称。

8

可以设置PS4变量,它为每一个命令,如果痕迹是正在执行只是执行之前评估:

PS4='$(echo $(date) $(history 1) >> /tmp/trace.txt) TRACE: ' 

然后,启用跟踪:

set -x 

停止跟踪,只是:

set +x 
+0

这听起来很有希望。我编辑了这个问题(因为我发现很难在评论中写入大量的代码)。我很接近,但无法弄清楚最后一步。 –

1

您可以使用陷阱与DEBUG要做到这一点,像trap 'a oneliner in here' DEBUG

2

如果有人通过Google发现此问题,我通过将以下内容添加到我的~/.bashrc来解决此问题。

PROMPT_COMMAND='echo "$(date +"%Y/%m/%d (%H:%M)") $(history 1 |cut -c 7-)" >> /tmp/trace' 
export PROMPT_COMMAND 

这导致具有的/ tmp /跟踪内容,诸如

2015/01/21 (14:34) pwd 
2015/01/21 (14:36) less /tmp/trace 
2015/01/21 (14:36) cd Documents 
2015/01/21 (14:36) cd .. 
2015/01/21 (14:36) ls -la 
2015/01/21 (14:36) pwd 
2015/01/21 (14:36) echo "helloWorld" 
  • PROMPT_COMMAND,其通过bash中运行的每个命令之后执行
  • $(date +"%Y/%m/%d (%H:%M)")打印的日期和时间
  • $(history 1 |cut -c 7-)打印命令
    • cut -c 7-删除了history否则将包括
  • >> /tmp/trace追加完整的字符串到您指定的文件数量。 (我建议不要在/tmp/中的任何内容,除非在重新启动计算机时将其删除。)