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

Nuc*_*ear 4 bash shell

我知道 bash 功能 !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
Run Code Online (Sandbox Code Playgroud)

我想使用 ! 来调用线路“ping google.com”。特征。我尝试了一些事情,但失败了:

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

/root# !ping  
ping 192.168.100.7
Run Code Online (Sandbox Code Playgroud)

一个简单的字符串,后面有空格!不起作用

/root# !ping google
ping 192.168.100.7 google
Run Code Online (Sandbox Code Playgroud)

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

/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
Run Code Online (Sandbox Code Playgroud)

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

/root# !?google
ping google.com
Run Code Online (Sandbox Code Playgroud)

可以做我想做的事吗?

ter*_*don 6

我可以想到几种方法:

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

    \n\n
    !?string[?]\n      Refer to the most recent command preceding the\n      current postition in the history list contain\xe2\x80\x90\n      ing  string.  The trailing ? may be omitted if\n      string is followed immediately by a newline.\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    所以,你应该能够这样做:

    \n\n
     !?ping google?\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 使用反向搜索功能。点击CtrlRans 开始输入ping google。找到相关命令后按 Enter 键。

  4. \n
\n