我想在 Bash 中实现一个函数,它在每次调用时增加(并返回)一个计数。不幸的是,这似乎很重要,因为我在子 shell 中调用该函数,因此它无法修改其父 shell 的变量。
这是我的尝试:
PS_COUNT=0
ps_count_inc() {
let PS_COUNT=PS_COUNT+1
echo $PS_COUNT
}
ps_count_reset() {
let PS_COUNT=0
}
Run Code Online (Sandbox Code Playgroud)
这将按如下方式使用(因此我需要从子shell调用函数):
PS1='$(ps_count_reset)> '
PS2='$(ps_count_inc) '
Run Code Online (Sandbox Code Playgroud)
这样,我就会有一个带编号的多行提示:
> echo 'this
1 is
2 a
3 test'
Run Code Online (Sandbox Code Playgroud)
可爱的。但由于上述限制不起作用。
一个无效的解决方案是将计数写入文件而不是变量。但是,这会在多个同时运行的会话之间产生冲突。当然,我可以将 shell 的进程 ID 附加到文件名。但我希望有一个更好的解决方案,不会让我的系统因大量文件而混乱。
在 CentOS 6.2 和 Bash 4.1.2(1) 上,我添加了一个文件,/etc/profile.d其中包含:
HISTTIMEFORMAT='%c : '
history -s "# some text as a marker"
Run Code Online (Sandbox Code Playgroud)
只要变量被设置并且标记被写入用户的历史列表(以及~/.bash_history他们的时间exit),这就会起作用。
问题是:
history -s 添加标记时不添加时间戳~/.bash_history文件未读入内存)我尝试添加:
history -s "#$(date +%s)"
Run Code Online (Sandbox Code Playgroud)
在另一个history -s命令之前,但 Bash 将其视为历史命令而不是时间戳,即使它的格式相同。
另一种选择是将标记和时间戳直接附加到~/.bash_history,但是当它稍后被附加时,它们与会话历史记录中的活动不相邻。由于其他用户或单个用户的多个会话,可能会有其他会话附加在标记及其相关会话之间。
有没有办法解决这些问题?
更新:
我已经尝试添加set -o history(并删除该history -s "#$(date +%s)"行)并且它似乎解决了上面提到的历史滚动问题,但是缺少时间戳仍然是一个问题。