Sostituzione del terminale! seguito da un numero con un comando


12

Sono molto confuso sulla mia sessione di terminale Ubuntu, sembra sostituire le sezioni nei comandi che iniziano !seguite da un numero con comandi apparentemente casuali. Lo fa !87sostituendolo con screen -le anche con !88e sostituito con ls.

Qualche idea sul perché questo accada sarebbe molto apprezzata.


Risposte:


20

Questa è l' bashespansione della storia, ad es

!87

riesegue il comando dalla riga della cronologia 87.

La descrizione di questa funzione è disponibile nella man bashsezione "ESPANSIONE STORIA":

       An  event  designator  is  a  reference  to a command line entry in the
       history list.  Unless the reference is absolute, events are relative to
       the current position in the history list.

       !      Start  a  history substitution, except when followed by a blank,
              newline, carriage return, = or ( (when the extglob shell  option
              is enabled using the shopt builtin).
       !n     Refer to command line n.
       !-n    Refer to the current command minus n.

Quindi, per chiamare rapidamente l'ultimo comando, esegui !-1e per il quinto ultimo comando !-5. Un utile sinonimo di !-1è !!: se hai chiamato eg apt install somethinge hai dimenticato il sudo, esegui sudo !!e sei bravo.

Solo la barra rovesciata ( \ ) e le virgolette singole possono citare il carattere di espansione della cronologia.

Per evitare l'espansione della cronologia, è necessario evitare il punto esclamativo con una barra rovesciata ( \!) o utilizzare le virgolette singole ( '!').


3
per trasmettere un valore letterale !ai tuoi comandi ed evitare l'espansione della cronologia, dovrai virgolette singole o sfuggirle: foo '!87'o foo \!87. (le doppie virgolette eseguiranno anche l'espansione dei loro contenuti.)
Quixotic il
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.