0

好的,所以似乎发生了一些奇怪的事情。当我以history -r交互方式运行时,它按预期工作:

$ printf %b '#1401928364\necho\n' > /tmp/hist  # Make a test history file with timestamp information.
$ history -r /tmp/hist  # Read it into the current history.
$ history 3  # Bash has interpreted the history comment character such that timestamps don't appear on their own line.
  220  2014-06-05Thu17:59:55  history -r /tmp/hist  # Read it into the current history.
  221  2014-06-05Thu00:32:44  echo
  222  2014-06-05Thu18:00:07  history 3  # Bash has interpreted the history comment character such that timestamps don't appear on their own line.

但是,从 my 运行它.bashrc并没有相同的预期行为:

$ printf %b 'history -r /tmp/hist\nhistory 3\n' > /tmp/bashrc  # Make a test bashrc file.
$ bash --rcfile /tmp/bashrc  # Run Bash with the test bashrc file; doesn't interpret the history comment character and prints a line containing ‘#1401928364’.
    1  #1401928364
    2  echo

我可以通过 Freenode 上的shbot确认这一点:

17:29:45 <JamesJRH> # printf %b '#1401928364\necho\n' > /tmp/hist; history -r /tmp/hist; history 3
17:29:47 <shbot>     1  printf %b '#1401928364\necho\n' > /tmp/hist; history -r /tmp/hist; history 3
17:29:47 <shbot>     2  echo
17:29:49 <JamesJRH> # printf %b '#1401928364\necho\n' > /tmp/hist; printf %b 'history -r /tmp/hist\nhistory 3\n' > /tmp/bashrc; bash --rcfile /tmp/bashrc
17:29:55 <shbot>     1  #1401928364
17:29:55 <shbot>     2  echo

那么这里发生了什么?我怎样才能让它从我的.bashrc文件中正常工作?

更新:

用我的外壳:

$ echo "$BASH_VERSION"; printf %b '#1401928364\necho\n' > /tmp/hist; printf %b 'export HISTTIMEFORMAT=\x27%F%a%T  \x27\nhistory -r /tmp/hist\nhistory 3\n' > /tmp/bashrc; bash --rcfile /tmp/bashrc
4.2.45(1)-release
    1  2014-06-05Thu19:42:31  #1401928364
    2  2014-06-05Thu19:42:31  echo

Summary                 interactive  bashrc
without HISTTIMEFORMAT  Succeeds.    Fails.
with HISTTIMEFORMAT     Succeeds.    Fails.

使用shbot

19:45:29 <JamesJRH> # echo "$BASH_VERSION"; printf %b '#1401928364\necho\n' > /tmp/hist; printf %b 'export HISTTIMEFORMAT=\x27%F%a%T  \x27\nhistory -r /tmp/hist\nhistory 3\n' > /tmp/bashrc; bash --rcfile /tmp/bashrc
19:45:36 <shbot> 4.3.18(1)-release
19:45:36 <shbot>     1  2014-06-05Thu00:32:44  echo
19:45:49 <JamesJRH> 42# echo "$BASH_VERSION"; printf %b '#1401928364\necho\n' > /tmp/hist; printf %b 'export HISTTIMEFORMAT=\x27%F%a%T  \x27\nhistory -r /tmp/hist\nhistory 3\n' > /tmp/bashrc; bash --rcfile /tmp/bashrc
19:45:56 <shbot> 4.2.47(2)-release
19:45:56 <shbot>     1  2014-06-05Thu00:32:44  echo
19:46:08 <JamesJRH> 41# echo "$BASH_VERSION"; printf %b '#1401928364\necho\n' > /tmp/hist; printf %b 'export HISTTIMEFORMAT=\x27%F%a%T  \x27\nhistory -r /tmp/hist\nhistory 3\n' > /tmp/bashrc; bash --rcfile /tmp/bashrc
19:46:15 <shbot> 4.1.11(1)-release
19:46:15 <shbot>     1  2014-06-05Thu00:32:44  echo

Summary                 interactive  bashrc
without HISTTIMEFORMAT  Succeeds.    Fails.
with HISTTIMEFORMAT     Succeeds.    Succeeds.

那么是什么导致了我的 Bash 和shbot之间的这种差异?

4

2 回答 2

1

如果您设置环境,它是否有效HISTTIMEFORMAT。首先变量,然后您尝试再次运行历史记录?

export HISTTIMEFORMAT="%F %T "

如果HISTTIMEFORMAT未设置,则时间戳不会写入历史文件。

于 2014-06-05T18:31:26.523 回答
0

唉!!

我终于确定了我的 shell 和shbot之间的区别,这确实是我最初怀疑的 Bash版本,但是shbot通过对我撒谎让我偏离了轨道!好吧,实际上这是由于shbot的实现细节,但我的命令的这种变化给出了哪些版本工作或不工作的真实故事:

03:31:11 <JamesJRH> # printf %b '#1401928364\necho\n' > /tmp/hist; printf %b 'echo "$BASH_VERSION"\nexport HISTTIMEFORMAT=\x27%F%a%T  \x27\nhistory -r /tmp/hist\nhistory 3\n' > /tmp/bashrc; bash --rcfile /tmp/bashrc
03:31:18 <shbot> 4.3.18(1)-release
03:31:18 <shbot>     1  2014-06-05Thu00:32:44  echo
03:31:25 <JamesJRH> # printf %b '#1401928364\necho\n' > /tmp/hist; printf %b 'echo "$BASH_VERSION"\nexport HISTTIMEFORMAT=\x27%F%a%T  \x27\nhistory -r /tmp/hist\nhistory 3\n' > /tmp/bashrc; bash42 --rcfile /tmp/bashrc
03:31:32 <shbot> 4.2.47(2)-release
03:31:32 <shbot>     1  2014-06-06Fri03:31:24  #1401928364
03:31:32 <shbot>     2  2014-06-06Fri03:31:24  echo

所以现在摘要指的是版本!

使用 Bash 4.2 及更早版本:

Summary                 interactive  bashrc
without HISTTIMEFORMAT  Succeeds.    Fails.
with HISTTIMEFORMAT     Succeeds.    Fails.*

* 在 4.2.47(2)-release、4.2.45(1)-release、4.2.25(1)-release、4.2.8(1)-release、4.1.11(1)-release、4.0 上测试。 38(1)-发布、3.2.51(2)-发布、3.2.39(1)-发布。

从 Bash 4.3 开始:

Summary                 interactive  bashrc
without HISTTIMEFORMAT  Succeeds.    Fails.
with HISTTIMEFORMAT     Succeeds.    Succeeds.*

* 在 4.3.18(1) 版本上测试。

仍然不完全确定为什么HISTTIMEFORMAT不需要以交互方式但在 中需要.bashrc,但这不是问题。

所以直接回答这个问题:它们只能从.bashrc如果使用的 Bash 版本至少为 4.3 并且HISTTIMEFORMAT变量已设置且不为 null 来解释。在我的情况下HISTTIMEFORMAT,我已经设置了,.bashrc所以问题出在版本上。显然这是一个错误,并且这个错误已被修复。

刚才需要去安装 Bash 4.3... :-)

于 2014-06-06T05:13:13.763 回答