【发布时间】:2016-05-27 13:43:44
【问题描述】:
到目前为止,我一直只使用在 .bashrc 文件中定义的别名和函数,但现在我需要知道如何配置函数以在我发出的每个命令之前/之后运行。我怎样才能实现它?
【问题讨论】:
-
PS1 用于命令之前,PROMPT_COMMAND 用于之后
标签: bash shell unix terminal cygwin
到目前为止,我一直只使用在 .bashrc 文件中定义的别名和函数,但现在我需要知道如何配置函数以在我发出的每个命令之前/之后运行。我怎样才能实现它?
【问题讨论】:
标签: bash shell unix terminal cygwin
有一个环境变量PROMPT_COMMAND,见the manual
PROMPT_COMMAND如果设置,该值被解释为一个命令 在打印每个主要提示之前执行 (
$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
【讨论】: