Frage Bash history - Erhalte den letzten Befehl nach String, der Leerzeichen enthält


Ich kenne den bash-Feature! Text, der den letzten Befehl startet, der mit "text" beginnt. Aber es scheint nicht zu funktionieren, wenn "Text" Platz enthält. Manchmal ist es nützlich, nach etwas zu suchen, das Leerzeichen enthält.

beispielsweise:

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

Ich möchte die Zeile "ping google.com" aufrufen, mit der! Feature. Ich habe einige Dinge ausprobiert, aber sie haben versagt:

Dies ist das Standardverhalten, es führt den letzten Ping-Befehl aus

/root# !ping  
ping 192.168.100.7

Eine einfache Zeichenfolge mit Platz nach! funktioniert nicht

/root# !ping google
ping 192.168.100.7 google

Wie ich weiß, sagen Zitate bash, eine Zeichenfolge mit Leerzeichen als eine einzige Zeichenfolge anstelle von zwei separaten Zeichenfolgen zu interpretieren. Aber hier funktioniert es nicht wie erwartet.

/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

Dies ruft den Befehl auf, aber es ruft den letzten Befehl auf, der die Zeichenfolge enthält. Ich möchte nur Befehle, beginnend mit "Ping"

/root# !?google
ping google.com

Ist es möglich zu tun, was ich will?


1
2017-08-22 13:47


Ursprung


!?ping google (oder auch nur !?ping g) würde funktionieren. Dies würde jedoch auch übereinstimmen echo ping google.com. - Tim


Antworten:


Sie können die Rückwärtssuche verwenden (control-r, wenn der Bearbeitungsmodus auf emacs eingestellt ist, was der Standardwert ist), und es funktioniert mit Leerzeichen.


1
2017-08-22 14:07





Ich kann mir ein paar Wege vorstellen:

  1. Benutzen ?. Das Folgende ist von 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.
    

    Also sollten Sie das tun können:

     !?ping google?
    
  2. Verwenden Sie die umgekehrte Suchfunktion. Schlagen StrgR ans beginnen zu tippen ping google. Drücken Sie Enter, wenn der entsprechende Befehl gefunden wurde.


1
2017-08-22 14:17