Cosa fa digitare un singolo punto esclamativo in Bash?


20

Bash utilizza punti esclamativi per le espansioni della cronologia, come spiegato nelle risposte a questa domanda (ad es. sudo !!Esegue la riga di comando precedente con sudo). Tuttavia, non riesco a trovare da nessuna parte ciò che spiega cosa fa l'esecuzione del seguente comando (cioè un singolo punto esclamativo):

!

Sembra non stampare nulla e uscire con 1, ma non sono sicuro del perché. Ho cercato online e nella pagina man di Bash, ma non riesco a trovare nulla, a parte il fatto che è una "parola riservata" - ma così è }, ed eseguendo questo:

}

stampa un errore:

bash: syntax error near unexpected token `}'

1
Niente. !indica "inizio" di un'espressione di espansione della cronologia.
Giordania,

Risposte:


47

Il solo !all'inizio di un comando annulla lo stato di uscita del comando o della pipeline : se il comando termina 0, si 1gira in (fallimento) e se esce da zero lo trasforma in 0un'uscita (riuscita).

Questo uso è documentato nel manuale di Bash:

Se la parola riservata "!" precede la pipeline, lo stato di uscita è la negazione logica dello stato di uscita come descritto sopra.

Un !senza comando seguente nega il comando vuota, che non fa nulla e ritorna vero (equivalenti al :comando ). In questo modo inverte il vero in falso ed esce con lo stato 1, ma non produce alcun errore.


Ci sono anche altri usi !all'interno dei comandi teste [[, in cui negano un test condizionale. Questi non sono correlati a ciò che stai vedendo. In entrambe le tue domande e in quei casi non è correlato all'espansione della cronologia e !è separato da altri termini.


5
+1 per la prima risposta per spiegare cosa viene effettivamente eseguito e perché ciò spiega il codice di ritorno.
Jeff Schaller

11

È possibile trovare il punto esclamativo singolo documentato nella sezione 3.2.2 Pipeline del manuale di bash

Se la parola riservata "!" precede la pipeline, lo stato di uscita è la negazione logica dello stato di uscita come descritto sopra.

$ ! true; echo $?
1
$ ! false; echo $?
0

Anche sezione 3.2.4.2 Costrutti condizionali

! espressione

Vero se l'espressione è falsa.


Anche la sezione 4.1 Bourne Shell Builtins

! espr

Vero se expr è falso.


Va anche notato che !inizierà la sostituzione della cronologia a meno che non sia seguito da: uno spazio, una scheda, la fine della riga, '=' o '(' (quando l'opzione shell extglob è abilitata usando il comando incorporato shopt).


0

Perché !è usato nei confronti e significa NOT .

Per esempio:

a=3
b=2

[ $a -eq $b ] && echo "Equal"
[ ! $a -eq $b ] && echo "Not equal"
# of cause last comparison is possible to write as:
[ $a -eq $b ] || echo "Not equal"

[ $a -eq $b ]
echo $?
1
[ ! $a -eq $b ]
echo $?
0

1
Questo è il significato di !come argomento per il testcomando (inclusa la versione integrata di bash), non il significato di !quando usato nella posizione di comando.
Gilles 'SO- smetti di essere malvagio' il

1
In ! [...]questo caso dovrebbe corrispondere alla domanda.
Michael Homer,

Concordato con @Gilles e @Michael Homer. Sapevo che lo []è test. Sono un po 'frettoloso.
Yurij Goncharuk,

-2

! comando incorporato, inverte il senso di una pipeline.

Altri usi:

#! comando incorporato, richiama l'interprete nominato per eseguire lo script.

! designatore di eventi, contrassegna una parola della riga di comando come sostituzione della cronologia

!= operatore di disuguaglianza

$! variabile shell, restituisce il numero di processo dell'ultimo comando in background.


Solo per aggiungere, si può usare! $ Per usare l'ultima parola del comando precedente in questo modo: ls -l /tmp cd !$ questo vi porterà alla directory / tmp.
Hopping Bunny,

-3

! seguito da una stringa esegue il comando precedente più recente (sempre nel buffer dei comandi) avviato con la stringa specificata. Forse la shell ha appena scoperto che nessun comando precedente è iniziato con <null>.


3
Hai notato che non c'era una stringa data nella domanda ...?
Jeff Schaller
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.