![我在 BASH 中发现了错误吗?](https://linux22.com/image/87546/%E6%88%91%E5%9C%A8%20BASH%20%E4%B8%AD%E5%8F%91%E7%8E%B0%E4%BA%86%E9%94%99%E8%AF%AF%E5%90%97%EF%BC%9F%20.png)
编辑:该错误在 4.3.8 版本中消失。
我在用GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
。我相信我发现了一个错误。想知道我是否遗漏了某些内容或者我的错误是否特定于版本/平台。
Bash 的历史函数将利用该HISTTIMEFORMAT
变量(如果已定义)。因此,如果
HISTTIMEFORMAT=%s
然后,history
产生:
60 1460542926 history
此外,history -w
历史文件中的结果包含:
#1460543065
cat $HISTFILE
#1460543082
HISTTIMEFORMAT=%s
#1460543084
history -w
然而,如果变量定义在这边走:
: ${HISTTIMEFORMAT:=%s }
那么输出history
是正确的,但是history -w
无法写入时间戳标头到$HISTFILE
。
unset HISTTIMEFORMAT
: ${HISTTIMEFORMAT:=%s }
history -w
如果我简单地执行export HISTTIMEFORMAT
或declare HISTTIMEFORMAT
,问题就会消失。然而,如果变量是反而通过自动导出set -a
,它不起作用。
我无法使用不同的变量 重现这种结果PS2
。
从版本 4.3.8 开始在 Mint 17 / Ubuntu 系统上运行
方法一
$ bash --version
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
$ bash --norc
bash-4.3$ HISTFILE=/tmp/histfile.$$
bash-4.3$ history -c
bash-4.3$ HISTTIMEFORMAT="%s "
bash-4.3$ history
1 1460642608 HISTTIMEFORMAT="%s "
2 1460642610 history
bash-4.3$ history -w
bash-4.3$ cat $HISTFILE
#1460642608
HISTTIMEFORMAT="%s "
#1460642610
history
#1460642612
history -w
bash-4.3$
方法二
$ bash --norc
bash-4.3$ HISTFILE=/tmp/histfile.$$
bash-4.3$ history -c
bash-4.3$ : ${HISTTIMEFORMAT:="%s "}
bash-4.3$ history
1 1460642758 : ${HISTTIMEFORMAT:="%s "}
2 1460642763 history
bash-4.3$ history -w
bash-4.3$ cat $HISTFILE
#1460642758
: ${HISTTIMEFORMAT:="%s "}
#1460642763
history
#1460642769
history -w
bash-4.3$
来自 RHEL6 和 RHEL7 系统
包括GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
和version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
方法一
~$ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
~$ bash --norc
bash-4.1$ HISTFILE=/tmp/histfile.$$
bash-4.1$ history -c
bash-4.1$ HISTTIMEFORMAT="%s "
bash-4.1$ history -w
bash-4.1$ cat $HISTFILE
#1460643571
HISTTIMEFORMAT="%s "
#1460643573
history -w
bash-4.1$ exit
方法二
~$ bash --norc
bash-4.1$ HISTFILE=/tmp/histfile.$$
bash-4.1$ history -c
bash-4.1$ : ${HISTTIMEFORMAT:="%s "}
bash-4.1$ history -w
bash-4.1$ cat $HISTFILE
: ${HISTTIMEFORMAT:="%s "}
history -w
bash-4.1$ history
3 1460643602 : ${HISTTIMEFORMAT:="%s "}
4 1460643606 history -w
5 1460643608 cat $HISTFILE
6 1460643719 history
答案1
进一步的研究表明这是一个错误,并在 4.2.x 和 4.3.6 版本之间的某个时间得到修复。