bash:如何在提示评估时保存状态

bash:如何在提示评估时保存状态

我想在命令提示符中输入上次运行命令的持续时间,f.ex:

user@host$ sleep 360
6m user@host$ 

另外,如果持续时间小于某个最小阈值(例如 30 秒),我希望不显示持续时间。

为了实现这一点,我可以将函数调用放入 PS1 中:

print_duration()
{
    ... calculation and formatting code ...
    echo -n $command_duration
}

PS1='$(print_duration)\u@\h:\W\$ '

问题是: print_duration() 将在子进程内进行评估,这将阻止更改主交互式 bash 的环境变量。

虽然我没有意识到上面的代码,但我将给出一个更简单的示例,将其剪切并粘贴到命令提示符中:

prompt_var=0

test_prompt()
{
    (( prompt_var++ ))
    echo -n "I was evaluated at $(date) and look at this: ${prompt_var} "
}

PS1='$(test_prompt)\$ '

这是结果:

I was evaluated at Fri, Mar 27, 2015 16:27:48 and look at this: 1 $
I was evaluated at Fri, Mar 27, 2015 16:27:52 and look at this: 1 $
I was evaluated at Fri, Mar 27, 2015 16:27:53 and look at this: 1 $

请注意,实际上 test_prompt() 确实第一次在主进程上下文中进行了评估(我想检查函数的有效性)。但对于实际的提示显示,它在子进程中执行此操作(这并不是很简洁)。

不过,如果我按照评论中的建议设置 PROMPT_COMMAND:

I was evaluated at Fri, Mar 27, 2015 16:38:02 and look at this: 1 $ PROMPT_COMMAND='(( prompt_var++ ))'
I was evaluated at Fri, Mar 27, 2015 16:38:09 and look at this: 2 $
I was evaluated at Fri, Mar 27, 2015 16:38:11 and look at this: 3 $
I was evaluated at Fri, Mar 27, 2015 16:38:12 and look at this: 4 $

这意味着 PROMPT_COMMAND 在主进程中进行评估。但是,使用它对我来说并不可取,因为我经常将它用于其他目的,并且链接它并不方便(并且可能会被忘记)。

答案1

使用PROMPT_COMMAND。你想做的正是它的目的。它在评估提示之前展开。如果您想从该代码中派生一些提示内容,请在 中设置变量PROMPT_COMMAND,打开promptvars多变的,并将这些变量包含在PS1.看有状态的 bash 函数在 PS1 中显示非零返回状态尤其是强制为每个命令添加“添加”别名举些例子。

您可以通过算术展开来更改提示符中的 shell 状态,但这种方式只能更改整数变量。扩展的结果出现在提示中,但您可以安排将其隐藏。

shopt -s promptvars
PS1='${nonexistent_array[$((counter+=$(calculate_increment)))]}…'

链接PROMPT_COMMAND非常简单:要向其中添加内容,请添加换行符,然后添加要运行的命令。

相关内容