bash:如何拦截每个命令

Yog*_*rma 8 bash

有没有办法拦截给出的每一个命令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}/'
Run Code Online (Sandbox Code Playgroud)

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会话的命令!

Mic*_*jer 8

您可以设置PS4变量,如果跟踪打开,该变量将在执行之前执行的每个命令进行评估:

PS4='$(echo $(date) $(history 1) >> /tmp/trace.txt) TRACE: '
Run Code Online (Sandbox Code Playgroud)

然后,启用跟踪:

set -x
Run Code Online (Sandbox Code Playgroud)

要停止跟踪,只需:

set +x
Run Code Online (Sandbox Code Playgroud)


Hol*_*way 5

如果有人通过谷歌发现这个问题,我通过将以下内容添加到我的~/.bashrc.

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

这会导致 /tmp/trace 包含诸如

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"
Run Code Online (Sandbox Code Playgroud)
  • PROMPT_COMMAND 在通过 bash 运行的每个命令之后执行
  • $(date +"%Y/%m/%d (%H:%M)") 打印日期和时间
  • $(history 1 |cut -c 7-) 打印命令
    • cut -c 7-删除history原本包含的数字
  • >> /tmp/trace将完整的字符串附加到您指定的文件中。(/tmp/除非您希望在重新启动计算机时将其删除,否则我建议不要进行任何操作。)


sau*_*uce 1

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