![bash:如何在提示评估时保存状态](https://linux22.com/image/6043/bash%EF%BC%9A%E5%A6%82%E4%BD%95%E5%9C%A8%E6%8F%90%E7%A4%BA%E8%AF%84%E4%BC%B0%E6%97%B6%E4%BF%9D%E5%AD%98%E7%8A%B6%E6%80%81.png)
我想在命令提示符中输入上次运行命令的持续时间,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
非常简单:要向其中添加内容,请添加换行符,然后添加要运行的命令。