有没有办法拦截给出的每一个命令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会话的命令!
您可以设置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)
如果有人通过谷歌发现这个问题,我通过将以下内容添加到我的~/.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/
除非您希望在重新启动计算机时将其删除,否则我建议不要进行任何操作。)不确定是否拦截每个命令,但在某些版本的 Linux 中,每个命令都会记录到 ~/.bash_history 中。您可以弄清楚它是如何工作的,或者只是解析该文件以查看最后一个命令。