配置对每个用户输入执行的操作
Configure an action to execute on every user input
到目前为止,我一直只使用 .bashrc
文件中定义的别名和函数,但现在我需要知道如何为 运行 before/after 每个命令配置函数制作。我怎样才能实现它?
有一个环境变量PROMPT_COMMAND
,见the manual
PROMPT_COMMAND
If set, the value is interpreted as a command to
execute before the printing of each primary prompt ($PS1
).
对于简单的情况,将其设置为别名:
PROMPT_COMMAND='echo "Something"'
对于更复杂的东西,你可以让它调用一个函数:
prompt_command () {
# If username has underscore, shorten to 'a_b'; else just use first letter
un="${USER:0:1}"
if [[ $USER == *?_?* ]]; then
local suff="${USER##*_}"
un+=_"${suff:0:1}"
fi
}
PROMPT_COMMAND=prompt_command
我用它来修改我的提示中的用户名,所以在我的 .bashrc
的其他地方有类似
的东西
export PS1="$un@\h $"
这是典型的 user@host $
提示,但用户名已动态缩短,如 PROMPT_COMMAND
函数中指定的那样。
这是一个 PS4
技巧。假设您想在每个命令之前使用 运行 date
命令,那么您可以将 PS4
设置为:
PS4='$(date)\n'
然后只需启用跟踪以在每个命令之前开始打印日期:
set -x
然后你可以看到每个命令执行之前出现的日期:
$> set -x
$> tty
Fri May 27 09:57:42 EDT 2016
tty
/dev/ttys004
$> uname
Fri May 27 09:57:48 EDT 2016
uname
Darwin
如果您想关闭此功能,只需使用以下命令关闭跟踪:
set -x
到目前为止,我一直只使用 .bashrc
文件中定义的别名和函数,但现在我需要知道如何为 运行 before/after 每个命令配置函数制作。我怎样才能实现它?
有一个环境变量PROMPT_COMMAND
,见the manual
PROMPT_COMMAND
If set, the value is interpreted as a command to execute before the printing of each primary prompt (
$PS1
).
对于简单的情况,将其设置为别名:
PROMPT_COMMAND='echo "Something"'
对于更复杂的东西,你可以让它调用一个函数:
prompt_command () {
# If username has underscore, shorten to 'a_b'; else just use first letter
un="${USER:0:1}"
if [[ $USER == *?_?* ]]; then
local suff="${USER##*_}"
un+=_"${suff:0:1}"
fi
}
PROMPT_COMMAND=prompt_command
我用它来修改我的提示中的用户名,所以在我的 .bashrc
的其他地方有类似
export PS1="$un@\h $"
这是典型的 user@host $
提示,但用户名已动态缩短,如 PROMPT_COMMAND
函数中指定的那样。
这是一个 PS4
技巧。假设您想在每个命令之前使用 运行 date
命令,那么您可以将 PS4
设置为:
PS4='$(date)\n'
然后只需启用跟踪以在每个命令之前开始打印日期:
set -x
然后你可以看到每个命令执行之前出现的日期:
$> set -x
$> tty
Fri May 27 09:57:42 EDT 2016
tty
/dev/ttys004
$> uname
Fri May 27 09:57:48 EDT 2016
uname
Darwin
如果您想关闭此功能,只需使用以下命令关闭跟踪:
set -x