【问题标题】:Configure an action to execute on every user input配置对每个用户输入执行的操作
【发布时间】:2016-05-27 13:43:44
【问题描述】:

到目前为止,我一直只使用在 .bashrc 文件中定义的别名和函数,但现在我需要知道如何配置函数以在我发出的每个命令之前/之后运行。我怎样才能实现它?

【问题讨论】:

  • PS1 用于命令之前,PROMPT_COMMAND 用于之后

标签: bash shell unix terminal cygwin


【解决方案1】:

有一个环境变量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 函数中的指定动态缩短。

【讨论】:

    【解决方案2】:

    这是一个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
    

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 1970-01-01
      • 2016-03-24
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多