这篇文章介绍一下Bash中的环境变量PROMPT_COMMAND。
PS1-PS4介绍了一些用于提示信息控制的环境变量,而在此之前可以进行回调的一个环境变量就是PROMPT_COMMAND,这个环境变量中设定的内容将在交互式脚本的提示(PS1)出现之前被执行。
关于环境变量PS1的使用介绍可以参看:
以如下环境中的Bash为例进行使用的说明
[root@liumiaocn ~]# echo $SHELL
/bin/bash
[root@liumiaocn ~]# bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@liumiaocn ~]#
[root@liumiaocn ~]#
[root@liumiaocn ~]# echo $PS1
[\u@\h \W]\$
[root@liumiaocn ~]#
设定如下的PROMPT_COMMAND
[root@liumiaocn ~]# export PROMPT_COMMAND="Hello LiuMiao"
-bash: Hello: command not found
[root@liumiaocn ~]#
command not found的提示说明了两件事情:
- 首先export命令只是一个环境变量设定和输出的过程,不会有产生command not found的动作。所以此错误信息是PROMPT_COMMAND的机制产生的,它会在用户交互的提示信息出现之间将设定在其中的内容作为可执行的命令执行。
- 其次,设定在PROMPT_COMMAND的内容执行的时间点在出现提示符(PS1所设定的内容)之前。
进行如下重新设定,可以看到设定内容已经即时生效了。
[root@liumiaocn ~]# export PROMPT_COMMAND="echo Hello LiuMiao "
Hello LiuMiao
[root@liumiaocn ~]#
进行任何操作都会首先执行此命令,比如:
[root@liumiaocn ~]# hostname
liumiaocn
Hello LiuMiao
[root@liumiaocn ~]#
如果使用macOS本身的终端,可以看到在Bash下,PROMPT_COMMAND的设定如下所示:
liumiaocn:~ liumiao$ echo $SHELL
/bin/bash
liumiaocn:~ liumiao$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
liumiaocn:~ liumiao$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.2
BuildVersion: 19C57
liumiaocn:~ liumiao$
liumiaocn:~ liumiao$ echo $PROMPT_COMMAND
update_terminal_cwd
liumiaocn:~ liumiao$
这本身就是PROMPT_COMMAND的一个使用示例,update_terminal_cwd是一个函数,我们来看一下它是在何处被定义的。首先Bash会使用全局设定的/etc/bashrc中设定的内容
liumiaocn:~ liumiao$ cat /etc/bashrc
if [ -z "$PS1" ]; then
return
PS1='\h:\W \u\$ '
shopt -s checkwinsize
[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"
liumiaocn:~ liumiao$
可以看到/etc/bashrc_*的文件如下所示:
liumiaocn:~ liumiao$ ls /etc/bashrc_*
/etc/bashrc_Apple_Terminal
liumiaocn:~ liumiao$
在这个文件之中就有update_terminal_cwd函数的定义
if [ -z "$INSIDE_EMACS" ]; then
update_terminal_cwd() {
local url_path=''
local i ch hexch LC_CTYPE=C LC_ALL=
for ((i = 0; i < ${#PWD}; ++i)); do
ch="${PWD:i:1}"
if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
url_path+="$ch"
printf -v hexch "%02X" "'$ch"
url_path+="%${hexch: -2:2}"
printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"
另外,利用此特性还可以记录用户的操作内容,虽然稍微复杂一点的场景下就不太适合,但是通过这些加深对此环境变量的理解。
#在最后一行追加以下环境变量
export HISTORY_FILE=/var/log/`date '+%y-%m-%d'`.log
export PROMPT_COMMAND='{ da...
浏览器打开
linux历史命令记录在history,在用户退出的时候写入,不过有时候可以直接绕过去,不让写入,比如shutdown now,还有在一些情况下也是不予保存的,这让人很头疼
使用PROMPT_COMMAND可以在用户输入一条命令,就直接记录,export HISTORY_FILE=/var/log/history/`date '+%Y-%m-%d'`.log
export PROMPT_COMMA
浏览器打开
在bash里设置环境变量PROMPT_COMMAND,这个命令会在用户提示符之前被执行,可以用来记录用户操作历史
[quote]PROMPT_COMMAND
If set, the value is executed as a command prior to issuing each primary prompt.[/quote]
为了防止用户覆盖PROMP...
浏览器打开
注:本文基于CentOS 6.5 编写
1、关于PROMPT_COMMAND环境变量
Bash在显示PS1之前先执行PROMPT_COMMAND定义的内容,而PS1也就是linux的命令提示符,关于PS1详细设置可参考:Linux 提示符后面显示全路径。
我们可以先感受一下PROMPT_COMMAND的功能效果,如果要显示命令执行的时间,可以如下操作。
[root@CentOS-6-5 /]# e...
浏览器打开
用惯了DOS的伙计刚用Unix时最想干的事情就是想把Unix搞得像DOS一些, 其中的一条就是把Unix的提示符设置成$p$g那样的。下面就说一说做的方法。 不同的SHELL设置的方法不同,比较方便的是GNU bash(Bourne Again Shell) 和ksh(Korn Shell)以及tcsh(csh的增强版,Linux中的csh就是到tcsh的一个 符号连接)。普通的sh(Bourne
浏览器打开
linux bash 变量fatmawati achmad zaenuri/ShutterstockFatmawati achmad zaenuri / Shutterstock There’s more than one type of environment variable on Linux. Learn how to see them, create them for local and ...
浏览器打开
export PROMPT_COMMAND='{ msg=$(history 1|{ read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg";}'
root@salt-zabbix init]# tail /var/log/messages
Sep 6 16:52:57 salt-zabbix
浏览器打开