如何在Linux上使用HISTORY命令

Linux的shell保存了您运行的命令的历史记录,您可以搜索它来重复您过去运行过的命令。一旦您理解了Linux历史命令以及如何使用它,它就可以极大地提高您的工作效率。

操纵历史记录

正如乔治·桑塔亚纳(George Santaana)的名言:“那些不记得过去的人注定要重蹈覆辙。”不幸的是,在Linux上,如果您不记得过去,即使您想要重复,也不能重复。

这就是Linux历史命令派上用场的时候。它允许您查看和重复以前的命令。这不仅仅是为了鼓励懒惰或节省时间--还有一个效率(和准确性)因素在起作用。命令越长越复杂,就越难记住和键入而不出错。有两种类型的错误:一种是阻止命令工作,另一种是允许命令工作,但使其执行一些意外的操作。

使用历史记录命令可以消除这些问题。与大多数Linux命令一样,它的功能比您想象的要多。但是,如果您学习如何使用HISTORY命令,它可以提高您每天对Linux命令行的使用。这是对你时间的一次很好的投资。有很多更好的方法来使用历史记录和命令,而不仅仅是反复点击向上箭头。

HISTORY命令

在其最简单的形式中,您只需键入其名称即可使用HISTORY命令:

history

然后将先前使用的命令列表写入终端窗口。

命令已编号,最近使用的命令(编号最高的命令)位于列表末尾。

要查看特定数量的命令,可以在命令行上向历史记录传递一个数字。例如,要查看最近使用过的10个命令,请键入以下命令:

history 10

如果通过Tail命令输送历史记录,则可以获得相同的结果。要执行此操作,请键入以下内容:

history | tail -n 10

相关:如何在Linux上使用管道

重复的命令

如果要重新使用历史记录列表中的命令,请键入感叹号(!)和命令编号,中间不带空格。

例如,要重复命令号37,应键入以下命令:

!37

要重复最后一个命令,请再次键入两个不带空格的感叹号:

!!

当您发出命令但忘记使用sudo时,这会很有用。键入sudo、一个空格和两个感叹号,然后按Enter键。

对于下面的示例,我们键入了一个需要sudo的命令。不需要重新键入整行,我们可以节省大量击键,只需键入“sudo!!”,如下所示:

mv ./my_script.sh /usr/local/bin/sudo !!

因此,您可以键入列表中的相应数字来重复命令,也可以使用双感叹号重复上次使用的命令。但是,如果您想重复第五个或第八个命令,该怎么办呢?

您可以使用一个感叹号、连字符(-)和前面任何命令的编号(同样,不带空格)来重复该命令。

要重复前面第13个命令,您需要键入以下内容:

!-13

按字符串搜索命令

若要重复以特定字符串开头的最后一个命令,可以键入感叹号,然后键入不带空格的字符串,然后按Enter键。

例如,要重复以sudo开头的最后一个命令,请键入以下命令:

!sudo

不过,这里面也有危险的因素。如果以sudo_s开头的最后一个命令不是您认为的命令,那么您将启动错误的命令。

不过,要提供安全网,您可以使用:p(打印)修饰符,如下所示:

!sudo:p

这会指示历史将命令打印到终端窗口,而不是执行它。这使您可以在使用命令之前查看该命令。如果这是您想要的命令,请按向上箭头,然后按Enter键使用它。

如果要查找包含特定字符串的命令,可以使用感叹号和问号。

例如,要查找并执行包含单词“aliases”的第一个匹配命令,应键入以下命令:

!?aliases

这将查找包含字符串“aliases”的任何命令,无论它出现在字符串中的什么位置。

交互式搜索

交互式搜索允许您跳过匹配的命令列表,并重复您想要的命令。

只需按Ctrl+r开始搜索。

当您键入搜索线索时,将出现第一个匹配的命令。您键入的字母出现在反号(`)和撇号(‘)之间。当您键入每个字母时,匹配的命令会更新。

每次按Ctrl+r时,都会向后搜索出现在终端窗口中的下一个匹配命令。

按Enter键时,将执行显示的命令。

要在执行命令之前对其进行编辑,请按向左或向右箭头键。

该命令显示在命令行上,您可以对其进行编辑。

您可以使用其他Linux工具搜索历史记录列表。例如,要将历史记录的输出通过管道传输到grep,并搜索包含字符串“aliases”的命令,您可以使用以下命令:

history | grep aliases

修改最后一个命令

如果需要修复拼写错误,然后重复该命令,可以使用脱字符(^)对其进行修改。这是一个很好的技巧,当您拼错命令或想要使用不同的命令行选项或参数重新运行命令时,请注意这一点。

要使用它,请键入(不带空格)插入符号、要替换的文本、另一个插入符号、要替换的文本、另一个插入符号,然后按Enter键。

例如,假设您键入以下命令,不小心键入了“shhd”而不是“sshd”:

sudo systemctl start shhd

您可以通过键入以下命令轻松更正此问题:

^shhd^sshd^

执行该命令时,将“shhd”更正为“sshd”。

从历史记录列表中删除命令

您还可以使用-d(删除)选项从历史记录列表中删除命令。没有理由将拼写错误的命令保留在历史记录列表中。

您可以使用grep查找它,使用-d选项将其编号传递给历史记录以删除它,然后再次搜索以确保它已删除:

history | grep shhdhistory -d 83history | grep shhd

您还可以将一系列命令传递给-d选项。要删除从22到32(含)的所有列表条目,请键入以下命令:

history -d 22 32

要仅删除最后五个命令,您可以键入负数,如下所示:

history -d -5

手动更新历史记录文件

当您登录或打开终端会话时,历史记录列表将从历史记录文件中读入。在Bash中,默认的历史文件是.bash_History。

只有在关闭终端窗口或注销时,您在当前终端窗口会话中所做的任何更改才会写入历史文件。

假设您想要打开另一个终端窗口来访问完整的历史列表,包括您在第一个终端窗口中键入的命令。-a(All)选项允许您在打开第二个终端窗口之前在第一个终端窗口中执行此操作。

要使用它,请键入以下内容:

history -a

命令以静默方式写入历史文件。

如果要将历史记录列表的所有更改写入历史记录文件(例如,如果删除了一些旧命令),可以使用-w(写入)选项,如下所示:

history -w

清除历史记录列表

要清除历史记录列表中的所有命令,可以使用-c(清除)选项,如下所示:

history -c

如果您还想强制对历史文件进行这些更改,请使用-w选项,如下所示:

history -w

安全性和历史文件

如果您使用的任何应用程序要求您在命令行中键入敏感信息(如密码),请记住这也会保存在历史文件中。如果您不想保存某些信息,可以使用以下命令结构立即将其从历史记录列表中删除:

special-app my-secret-password;history -d $(history 1)history 5

此结构包括用分号(;)分隔的两个命令。我们来分析一下这个:

Special-app:我们正在使用的程序的名称。 my-ret-password:我们需要在命令行上为应用程序提供的加密密码。一号指挥部到此为止。 History-d:在命令2中,我们调用历史的-d(删除)选项。我们要删除的是命令的下一部分。 $(HISTORY 1):这使用命令替换。在子外壳中执行包含在$()命令中的命令部分。执行结果将作为文本发布在原始命令中。HISTORY 1命令返回上一个命令。因此,您可以将第二个命令视为History-d“这里的最后一个命令”。

您可以使用HISTORY 5命令确保包含密码的命令已从历史记录列表中删除。

不过,还有一种更简单的方法可以做到这一点。由于Bash默认情况下会忽略以空格开头的行,因此只需在行首包含一个空格,如下所示:

special-app another-passwordhistory 5

带有密码的命令不会添加到历史记录列表中。此技巧有效的原因包含在.bashrc文件中。

.bashrc文件

每次登录或打开终端窗口时,都会执行.bashrc文件。它还包含一些控制HISTORY命令行为的值。“让我们使用Gedit编辑此文件。

键入以下内容:

gedit .bashrc

在文件顶部附近,您可以看到两个条目:

HISTSIZE:*历史记录列表可以包含的最大条目数。 HISTFILESIZE:限制历史文件可以包含的行数。

这两个值以以下方式交互:

当您登录或启动终端窗口会话时,历史记录列表由.bash_History文件填充。 关闭终端窗口时,HISTSIZE中设置的最大命令数将保存到.bash_History文件中。 如果启用了histappend shell选项,则命令将附加到.bash_History。如果未设置histappend,则会覆盖.bash_History。 将历史记录列表中的命令保存到.bash_History后,历史记录文件将被截断,以包含不超过HISTFILESIZE行。

同样在文件顶部附近,您可以看到HISTCONTROL值的条目。

您可以设置此值以执行以下任一操作:

忽略响应:以空格开头的行不会添加到历史记录列表中。 Ignore redups:不会将重复的命令添加到历史文件中。 Ignore Both:同时启用上述两项功能。

您还可以列出不希望添加到历史记录列表中的特定命令。用冒号(:)分隔它们,并用引号(“…”)将它们引起来。。

您可以按照此结构向.bashrc文件中添加一行,并替换要忽略的命令:

export HISTIGNORE="ls:history"

使用时间戳

如果要将时间戳添加到历史记录列表,可以使用HISTIMEFORMAT设置。要执行此操作,只需向.bashrc文件添加类似以下内容的行:

export HISTTIMEFORMAT="%c "

请注意,在右引号之前有一个空格。这可防止时间戳与命令列表中的命令发生冲突。

现在,当您运行HISTORY命令时,您会看到日期和时间戳。请注意,添加时间戳之前历史记录列表中的任何命令都将使用接收时间戳的第一个命令的日期和时间标记时间戳。在下面显示的这个示例中,这是命令118。

那是一个非常冗长的时间戳。但是,您可以使用除%c之外的令牌来细化它。您可以使用的其他令牌包括:

%d:天。 %m:月。 %y:年份。 %H:1小时。 %M:1分钟。 %S:秒。 %F:完整日期(年-月-日期格式)。 %T:时间(小时:分钟:秒格式)。 %c:完整的日期和时间戳(日-日-月-年和小时:分钟:秒格式)

让我们试验并使用几个不同的令牌:

export HISTTIMEFORMAT="%d n%m %T "

输出使用日、月和时间。

不过,如果我们去掉日期和月份,它只会显示时间。

您对HISTIMEFORMAT所做的任何更改都会应用于整个历史记录列表。这是可能的,因为每个命令的时间都存储为从Unix纪元开始的最大秒数。HISTTIMEFORMATT指令只是指定用于将该秒数呈现为人类可读样式的格式,例如:

export HISTTIMEFORMAT="%T "

我们的产量现在更容易管理了。

您还可以使用HISTORY命令进行审计。有时,查看您过去使用过的命令可以帮助您确定可能导致问题的原因。

就像在生活中可以做到的一样,在Linux上,你可以使用历史记录命令来重温好时光,从不好的时候学习。

相关:37条您应该知道的重要Linux命令

相关文章