为什么Mac Terminal在两个连续的命令相同时会记住它们?


10

我最近开始使用Mac,而在以前的Ubuntu上工作之前。

假设我在终端上一个接一个地运行以下命令:

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

现在假设我想python main.py再次运行,因此我将单击向上键。我只需要在Ubuntu上单击两次键,而在Mac上则单击7次。

如果两个连续命令相同,则终端应仅记住一个命令,而不要记住两个不同的命令。

如何在macOS上实现此目的?


6
只是为了学究,实际上不是mac终端正在执行此操作。这是bash,您的shell在终端中运行。Shell有很多,可以用其他类似的东西替换默认的Shell,zsh甚至进一步使用各种脚本自定义zsh,这是可能且普遍的。
gman

Answers:


13

您需要将HISTCONTROL环境变量添加到.bash_profile。在您.bash_profile添加以下行:

export HISTCONTROL=ignoreboth:erasedups

关闭并重新启动您的bash会话,并且欺骗对象将消失。或者,您可以只执行同一行,它将在该会话中生效(使用它进行测试)。


从(在终端中)的手册页bash

HISTCONTROL用
冒号分隔的值列表,用于控制如何在历史记录列表中保存命令。如果值列表包含ignorespace,则以空格字符开头的行不会保存在历史记录列表中。忽略的值将导致不保存与上一个历史记录条目匹配的行。ignoreboth的值是ignorespaceignoreups的简写。擦除值的值使与当前行匹配的所有先前行在保存该行之前从历史记录列表中删除。不在上面列表中的任何值都将被忽略。如果HISTCONTROL如果未设置或不包含有效值,则由外壳解析器读取的所有行都会保存在历史记录列表中,但要遵循HISTIGNORE的值。多行复合命令的第二行和后续行未经测试,并且无论HISTCONTROL的值如何都添加到历史记录中。


4

为什么会这样?

MacOS和Ubuntu的开箱即用配置不同,可以处理bash命令历史记录中的重复项。这些配置存储在许多所谓的“ 点文件 ”中。它们采用〜/ .bash *的形式以及系统范围内的/ etc / profile。所有这些文件都可以根据您的喜好进行定制,并在交互式外壳,登录外壳,远程外壳等之间进行区分。这些文件以特定的顺序读取并具有特定的功能。

如何在macOS上获得相同的行为?

如果您只想单次定制“忽略命令行的精确重复”,则可以使用Allan的答案,即在例如bash_profile文件中添加一行。没有“正确的方法”,而是无数的选择。

如果这不是bash的唯一定制,那么这可能不是最佳选择:

其他一些注意事项:

  • 图形应用程序可用的所有内容或sh(或bsh调用的bash)都必须位于〜/ .profile中
  • 〜/ .bashrc不得输出任何内容
  • 只有登录外壳可用的所有内容都应放在〜/ .profile中
  • 确保〜/ .bash_login不存在。

这意味着,当事情变得更复杂的是不错的主意,以分散的的定制成多个文件,他们每个人的专业和在内容上高度有序的:

exports为了简化监督,所有人都可以驻留在自己的文件中。

在用户目录的根目录下创建一个由bash读取的文件,例如.exports,该文件包含:

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

这需要“来源”,以便在交互式启动时由bash读取文件:

采购文件
如果您有许多Shell配置,则可能需要将其拆分为几个子文件,并使用内置的源代码从.bashrc中加载​​它们并添加source ~/.exports到其中。

或者,确保在加载之前文件确实存在

if [ -f ~/.exports ]; then
. ~/.exports
fi

该命令. ~/.exports~/.exports在当前运行的shell上下文中提供源代码。

这对于添加别名特别有用,单独的文件使您在进行更改时更容易重新加载它们。


2
如何.exports读取(来源)?
fd0

1
@ fd0,就其本身而言,它并非来自macOS。艾伦的答案是实现这一目标的正确方法。
user3439894 '17

如果将的值HISTCONTROL设置为.bashrc并将~/.bashrc其来源为,~/.bash_profile则不需要exportHISTCONTROL变量。交互式登录外壳程序和交互式外壳程序都将设置变量。
fd0

@ fd0确实:如果。/如果我不明白:我的意思是为Allan同时发布的A /&esp _profile文件提供一个替代项,同时让其余部分尽可能整洁,因为这是考虑到许多选项/设置的情况。您的最后一点是对您认为上述方法是“错误”的补充建议还是更正?现在,我读到您的评论是在我和艾伦之间就所解决的复杂性问题发表的意见?
LаngLаngС

1

唯一地记录每个新命令是很棘手的。首先,您需要添加 ~/.profile或类似内容:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

然后,您需要添加到~/.bash_logout

history -a
history -w
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.