2011-08-03 75 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/中的任何內容,除非在重新啓動計算機時將其刪除。)