Bash 历史记录 - 通过字符串获取最后一个命令,包含空格

Bash 历史记录 - 通过字符串获取最后一个命令,包含空格

我知道 bash 功能 !text,它运行以“text”开头的最后一个命令。但是当“text”包含空格时,它似乎不起作用。有时搜索包含空格的内容很有用。

例如:

history | grep ping
  514  ping 192.168.100.2
  515  ping 192.168.100.3
  516  ping 192.168.100.4
  517  ping google.com
  518  ping 192.168.100.5
  519  ping 192.168.100.6
  520  ping 192.168.100.7

我想使用 ! 功能调用该行“ping google.com”。我尝试了一些方法,但都失败了:

这是标准行为,它运行最后一个 ping 命令

/root# !ping  
ping 192.168.100.7

! 后带空格的简单字符串不起作用

/root# !ping google
ping 192.168.100.7 google

据我所知,引号告诉 bash 将带空格的字符串解释为单个字符串,而不是两个单独的字符串。但在这里它没有按预期工作。

/root# !"ping google"
bash: !"ping: event not found

/root# !'ping google'
bash: !'ping: event not found

/root# "!ping google"
"ping 192.168.100.7 google google"

/root# '!ping google'
bash: !ping google: command not found

/root# !\"ping google\"
bash: !\"ping: event not found

/root# !(ping google) 
bash: !: event not found

这将调用命令,但它将调用包含字符串的最后一个命令。我只想要以“ping”开头的命令

/root# !?google
ping google.com

我可以做我想做的事吗?

答案1

您可以使用向后搜索(如果编辑模式设置为 emacs,这是默认设置,则为 control-r),它与空格一起使用。

答案2

我想到了一些方法:

  1. 使用?。以下内容来自man history

    !?string[?]
          Refer to the most recent command preceding the
          current postition in the history list contain‐
          ing  string.  The trailing ? may be omitted if
          string is followed immediately by a newline.
    

    因此,你应该能够做到这一点:

     !?ping google?
    
  2. 使用反向搜索功能。点击CtrlR并开始输入ping google。找到相关命令后按回车键。

相关内容