it-swarm.it

Comprensione del punto esclamativo (!) In bash

Ero solito

history | less

per ottenere le righe dei comandi precedenti e dai numeri sul lato sinistro ho trovato la riga che volevo ripetere (es. 22) e ho fatto

!22

al comando Prompt e ha funzionato - eseguendo il set di comandi sulla linea che ho fatto in quel momento. Non riesco a capire dove viene utilizzato il punto esclamativo, cosa rappresenta in termini di azioni intraprese da bash e dove usarlo. Dalla documentazione non vedo una spiegazione "tangibile".

112
Vass

! è una funzionalità che è apparso originariamente in C Shell , nei giorni precedenti che si potevano contare sui terminali per avere i tasti freccia. È particolarmente utile se aggiungi il numero del comando corrente al Prompt (PS1="\!$ ") in modo da poter rapidamente guardare lo schermo per ottenere numeri per i comandi precedenti.

Ora che puoi usare i tasti freccia e cose del genere Ctrl-R per cercare nella cronologia dei comandi, non vedo molto uso della funzione.

Una variante che potresti trovare utile è !!, che esegue nuovamente il comando precedente. Da solo, non lo trovo !!Enter più veloce di solo Enter, ma può essere utile se combinato in un comando più grande.

Esempio: Un comune errore pilota su Sudo i sistemi basati sono da dimenticare il prefisso Sudo su un comando che richiede privilegi extra. Un principiante digita nuovamente l'intero comando. Lo studente diligente modifica il comando dalla cronologia dei comandi di Shell. L'illuminato digita Sudo !!.

Bash ti consente di disabilitare ! elaborazione in Shell con set +o histexpand o set +H. Puoi disabilitarlo in Zsh con set -K.

157
Warren Young

Se non c'è una risposta più lunga qui ce n'è sicuramente una su Super User, dato che ne ho letto una di recente. Nella pagina man di bash puoi trovare un'enorme sezione intitolata ESPANSIONE DI STORIA sull'argomento.

Puoi fare un intero Host più che eseguire l'ultimo comando o il numero di comando X. Puoi fare cose come !cat per eseguire l'ultimo comando iniziato con cat. O !?bash?:s/bash/csh/ esegue l'ultimo comando contenente bash ma lo sostituisce con csh.

52
Cry Havok

Si può fare molto di più con ! ad esempio:

  • eseguire un comando che viene digitato prima di 3 comandi: !-3
  • eseguire un comando che inizia con !ls

e molto di più. Vedi 15 esempi di espansione della cronologia di Linux Bash che dovresti conoscere

40
user379997

Ovviamente puoi fare !! per riutilizzare l'ultimo comando in bash Shell. E poi c'è !$ per riutilizzare l'ultima parte del tuo ultimo comando.

per esempio. visualizza alcuni file

less path/to/your/file.txt

Se ora desideri modificare lo stesso file, puoi utilizzare !$ per ottenere solo il percorso del file dall'ultimo comando

vim !$

MODIFICARE:

Puoi usare tutti gli argomenti del comando precedente con !*

es .: Questo creerà alcuni file e li rimuoverà tutti

$ touch a.txt b.txt c.txt d.txt
$ rm !*

Ancora una volta, è possibile utilizzare un argomento specifico del comando precedente

per esempio. Questo crea 4 file e rimuoverà il 3o file (c.txt)

$ touch a.txt b.txt c.txt d.txt
$ rm !:3

Allo stesso modo, è possibile utilizzare una serie di argomenti dall'ultimo comando come segue

$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4

Questo riutilizzerà gli argomenti da 2 a 4 che valutano l'espressione in rm b.txt c.txt d.txt

6

Un mio amico mi ha inviato questa email:

Fa parte di GNU. In bash è usato per rieseguire i comandi nella tua cronologia. Se vuoi essere hardcore, grep per history_expansion_char in bash-4.1/lib/readline/histexpand .c per i dettagli di implementazione.

4
Vass