Cosa significa! $?

Sto seguendo un tutorial e menziona di eseguire questo comando:

sudo chmod 700 !$ 

Non ho familiarità con !$. Che cosa significa?

Commenti

  • ' è generalmente sicuro provare a echo qualcosa se ' non sei sicuro di cosa ' farai.
  • @ Shadur, non sempre. echo $(rm -rf /)
  • @cjm A meno che ' non utilizzi un sistema molto vecchio, ' avrai bisogno dellopzione --no-preserve-root e se vedi le parole " non conservare " in un programma è meglio che pensi molto attentamente a ciò che fa.
  • @WChargin Stai molto attento supponendo che " sia molto vecchio " e " non Linux / non utilizza GNU coreutils " sono la stessa cosa; non sono ' t.

Risposta

Fondamentalmente, “è lultimo argomento del comando precedente.

!$ è la” fine “del comando precedente Considera il seguente esempio: Iniziamo cercando una parola in un file:

grep -i joe /some/long/directory/structure/user-lists/list-15 

se Joe è in quellelenco utenti, vogliamo rimuoverlo da esso Possiamo avviare vi con quel lungo albero di directory come argomento, o semplicemente come vi !$ Quale bash si espande in:

vi /some/long/directory/structure/user-lists/list-15 

( sorgente ; a proposito, guida pratica)


Non vale nulla la distinzione tra questo !$ token e la variabile di shell speciale $_ . In effetti, entrambi si espandono allultimo argomento del comando precedente. Tuttavia, !$ viene espanso durante l espansione della cronologia , mentre $_ viene espanso durante l espansione dei parametri . Una conseguenza importante di ciò è che, quando utilizzi !$, il comando Expand viene salvato nella tua cronologia.

Ad esempio, considera le sequenze di tasti

  • echo Foo Invio echo !$ Jar Invio Su Invio ; e

  • echo Foo Invio echo $_ Jar Inserisci Su Invio.

(gli unici caratteri modificati sono $! e $_ al centro.)

Nella prima, quando premi Su , la riga di comando legge echo Foo Jar, quindi lultima riga scritta in stdout è Foo Jar.

In questultima, quando premi Su , la riga di comando legge echo $_ bar, ma ora $_ ha un valore diverso da quello precedente, anzi, $_ ora è Jar, quindi lultima riga scritta in stdout è Jar Jar.

Unaltra conseguenza è che _ può essere utilizzato in altre espansioni di parametri, ad esempio, la sequenza di comandi

printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles 

stampa isomorphism isosceles. Ma non esiste unespansione ${!$%morphism} “analoga.

Per ulteriori informazioni sulle fasi di espansione in Bash, vedere il EXPANSION sezione di man 1 bash (questo è chiamato Shell Expansions nelledizione online). Il HISTORY EXPANSION La sezione è separata.

Commenti

  • Bello. Buono a sapersi. Inoltre, buona cosa ' s Stack Exchange. ' è difficile cercare su Google qualcosa come !$
  • A proposito, sulla riga di comando, puoi inserire lultimo argomento del comando precedente da insert-last-argument, solitamente associato a M-..
  • @Andrew, ricordati di accettare questo messaggio se risponde alla tua domanda. Accettare e votare a favore anziché postare commenti è il modo in cui i ringraziamenti vengono espressi sulla rete SE, vedi qui per " ufficiale " posizione.
  • @Andrew FYI, ho cercato su Google " bash bang dollar " e ho ottenuto risultati decenti, incluso questo link come terzo elenco.
  • @terdon Ho provato ad accettare la risposta ieri sera, ma è stato così veloce che sono stato costretto ad aspettare per accettarlo.

Risposta

In senso stretto !$ è lultima parola dellultimo comando dallelenco della cronologia.

parola – Una sequenza di caratteri trattata come ununità dalla shell. Le parole non possono includere metacaratteri non quotati.

metacarattere: un carattere che, se non quotato, separa le parole. Un metacarattere è uno spazio vuoto o uno dei seguenti caratteri: |, &, ;, (, ), <” o “>”

vuoto: uno spazio o un carattere di tabulazione.

Esempi:

set -o history # enable command history set -o histexpand # enable ! style history substitution HISTSIZE=10 # save all lines on the history list HISTCONTROL= HISTIGNORE= date echo !$ # prints date date>/dev/null echo !$ # prints /dev/null echo a b c>/dev/null echo !$ # prints /dev/null HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list echo a b c echo d e f # space at the beginning echo !$ # prints c 

Commenti

Risposta

!$ ti darà lultimo comando utilizzato per quel particolare utente ….

puoi anche trovare la cronologia dei comandi usati in precedenza usando il comando history … provalo ….

NOTA: per un particolare utente, tutti i comandi utilizzati in precedenza verranno memorizzati nel file di cronologia bash.

Commenti

  • Le altre risposte sono corrette. Questo è sbagliato.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *