有谁知道为什么 bash 仍然有历史替代默认启用?我的.bashrc
已经包含set +H
很多年了,但其他一些人仍然被这个功能所困扰。
鉴于几乎每个人都使用具有复制粘贴功能的终端和readline
bash 用库编译和默认情况下,历史替换仅在交互式 shell 中启用,真的有理由拥有该功能吗?即使默认情况下对所有 shell 禁用此功能,现有脚本也不会被破坏。
如果您不知道为什么历史替换被破坏,请尝试以下操作:
$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?
(显然,如果默认情况下对所有脚本禁用该功能,并且存在在执行之前验证结果的功能,则该功能存在重大问题:shopt -s histverify
。)
也可以看看:
答案1
如果您已经熟悉bash
,那么处理历史替换模式并不比处理该 shell 特有的任何其他字符更容易困扰您。然而,如果一个人不熟悉 shell 或者只是从未使用过它的历史替换功能,那么当看似无害的不带引号或双引号的字符串触发它时,显然会感到惊讶。
在启用历史替换的交互式 shell 中,字符的特殊性与字符的特殊性!
几乎相同,即无处不在,除非用单引号字符串转义或在单引号字符串中转义。$
\
与$
through 不同,历史替换不会在此处文档中展开,并且由于它们是面向行的,因此它们另外将要 发生在替换位于未加引号的上下文或双引号上下文中的行上(单独扫描时在该行中)。请参阅此错误报告以获取更多信息。
在非交互式 shell(脚本)中禁用历史记录替换是因为那里不需要 shell 的命令历史记录功能,而不是因为该功能存在“重大问题”。在脚本中,保存每个命令是$HISTFILE
没有意义的,并且历史替换同样不是您希望在脚本中依赖的东西。
是否应该在交互式 shell 中默认启用它是可以争论的(尽管我并不完全相信争论这里对开发商来说非常重要bash
)。您似乎认为大多数bash
用户都遇到历史扩展问题,但您和我都不知道使用它们有多常见。
Unix shell 允许人们修改 shell 的行为以适应个人需求和品味。如果您想关闭所有交互式 shell 的历史记录替换,请继续执行您在文件set +H
中使用的操作~/.bashrc
,或者游说bash
开发人员更改默认值(我相信,这会让更多的人感到不安和困惑,而不是有帮助) )。
答案2
历史替换很有用。举个例子
% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.
答案3
社会/文化惯性。
这个问题属于人类如何工作的问题空间,所以我将从这个角度回答,而不对该功能是否存在提出任何意见应该默认情况下处于打开状态。
首先,为了确保您理解对方,请考虑一下,您对不得不特意关闭该功能感到的烦恼,就是他们对您的烦恼。会感觉他们是否必须不遗余力地打开该功能。
结合上述情况,再加上有足够多的bash
用户确实使用该功能,默认情况下删除或关闭它的建议遭到了那些已经习惯默认情况下存在的人的抵制。
另外,bash
它是许多人的默认 shell(不是只是在默认登录或系统 shell 意义上,但在心理意义上)。如果您的 shell 引用的参考框架是bash
,如果这是您首先学习的 shell,那么它!
是一个特殊的 shell 字符这一事实对您来说会感觉自然且自动(或者至少,当您第一次学习它时,它将只是shell 的方式只是众多怪癖中可以接受的一个)。
如果你想一想,很多bash
用户可能会遇到历史替换语法积极的背景:当他们第一次学习时,他们读到它或有人向他们展示它,并且他们看到它可能的用处bash
。
只有来自其他类似《谍影重重》的外壳的外围世界,你才会被!
特殊的感觉所吸引和因此,倾向于消极地看待它:因为如果你习惯了从未有过该功能的 shell,那么当你试图匆忙完成某件事时,你第一次接触到它的时候就会是它给你带来麻烦的时候。
TL;DR:大多数用户可能不太关心默认无论哪种方式,一些用户喜欢该功能,并且已经拥有这种功能的强大优势,并且没有足够多的人积极倡导反对该功能来克服这一点。
答案4
为什么 bash 历史记录替换仍然默认启用?
因为很多人使用它,并且使用交互式 bash shell 的人可能应该了解避免问题的规则,通常会发现它的帮助大于伤害。
我的 .bashrc 已经包含 set +H 多年了,但其他一些人仍然被这个功能所困扰。
因此,这是一个您不使用的功能,并不意味着大多数用户不使用它。您可以请求更改默认设置,但您必须考虑 A)关心,和 B) 喜欢你的方式的人的比例。那些人关心和不喜欢它可能已经禁用它了。当他们在新计算机上获得帐户时,更改它会有所帮助。人们认为关心和喜欢它将来必须更新他们使用的每台计算机和他们获得的每个帐户上的设置。
鉴于几乎每个人都使用具有复制粘贴功能的终端
在我看来,这是一个更笨重的选择......
真的有理由拥有这个功能吗?即使默认情况下对所有 shell 禁用此功能,现有脚本也不会被破坏。
是的,人们发现它很有用。过去只要站起来换台就可以了,那么遥控器有什么用呢?
(显然,如果默认情况下对所有脚本禁用该功能,并且存在在执行前验证结果的功能:shopt -s histverify,则该功能存在重大问题。)
历史在脚本中并没有真正的意义,但更重要的是它可能会导致安全问题。在您的情况下,您可以通过使用单引号来避免该问题。我不记得这对我造成过问题,所以我不知道你怎么能说它有“重大问题”。这是否给您带来了实际问题,或者您是否因为必须在新计算机上设置默认值而感到恼火?
如果你真的想得到一些钱,我不明白这与必须转义或使用单引号有什么不同:
$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it