Cosa significa `(backquote / backtick) nei comandi?


160

Mi sono imbattuto nel seguente comando:

sudo chown `id -u` /somedir

e mi chiedo: qual è il significato del `simbolo. Ho notato ad esempio che mentre il comando sopra funziona bene, quello sotto non lo fa:

sudo chown 'id -u' /somedir

Risposte:


201

Questo è un backtick . Un backtick non è un segno di virgolette. Ha un significato molto speciale. Tutto ciò che digiti tra i backtick viene valutato (eseguito) dalla shell prima del comando principale (come chownnei tuoi esempi) e l' output di tale esecuzione viene utilizzato da quel comando, proprio come se dovessi digitare quell'output in quel punto nel riga di comando.

E allora

sudo chown `id -u` /somedir

funziona in modo efficace (a seconda del tuo ID utente ) è:

sudo chown 1000 /somedir
  \    \     \     \
   \    \     \     `-- the second argument to "chown" (target directory)
    \    \     `-- your user ID, which is the output of "id -u" command
     \    `-- "chown" command (change ownership of file/directory)
      `-- the "run as root" command; everything after this is run with root privileges

Dai un'occhiata a questa domanda per scoprire perché, in molte situazioni, non è una buona idea usare i backtick.

A proposito, se hai mai voluto usare un backtick letteralmente, ad esempio in una stringa, puoi evitarlo posizionando una barra rovesciata ( \) prima di esso.


36
Questo spiega abbastanza bene i backtick, ma usare $(your expression)è un modo migliore per fare la stessa cosa che $()ti permette di annidare le espressioni. per esempio: cd $(dirname $(type -P touch))ti inserirà nella directory contenente il touchcomando
Khaja Minhajuddin il

11
@KhajaMinhajuddin Hai sicuramente ragione sull'annidamento: la domanda sopra menzionata lo copre in dettaglio. Ma anche se penso che sia una buona pratica da usare $()nella maggior parte delle situazioni, non rende i backtick una cosa peggiore . Ai fini pratici, si deve ammettere che sono molto più veloci da digitare sulla riga di comando (2 sequenze di tasti rispetto ad almeno 5, incluso Shift).
rozcietrzewiacz,

2
@rozcietrzewiacz La tua ultima osservazione è probabilmente vera per la maggior parte delle tastiere, ma $( )è sicuramente più facile da scrivere che ` `almeno su una tastiera francese.
jlliagre,

1
@KhajaMinhajuddin È possibile nidificare i backtick, ma è necessario sfuggire al 2 ° livello di backtick e il 2 ° livello di nidificazione è necessario 3 backtick, 3 ° livello di nidificazione 5 backtick, 4 ° livello 7 e così via.
JustinCB,

66

Vorrei aggiungere alcuni altri punti qui.

Il backtick `…`è in realtà chiamato sostituzione del comando . Lo scopo della sostituzione del comando è di valutare il comando che si trova all'interno del backtick e fornire il suo risultato come argomento al comando effettivo.

La sostituzione del comando può essere effettuata in due modi: uno è in uso $(…)e l'altro è `…`. Entrambi funzionano allo stesso modo, ma la $(…)forma è moderna e ha maggiore chiarezza e leggibilità.

E così

sudo chown $(id -u) /somedir

può essere preferito rispetto all'altro.

E un'altra cosa che devi notare qui è la relazione di sostituzione dei comandi con le regole di quotazione di bash come menzionato nel documento bash .

Se la sostituzione appare tra virgolette, la divisione delle parole e l'espansione del nome del file non vengono eseguite sui risultati.


8
Inoltre, $(...)nidifica meglio.
Kusalananda

$()e "``"non funzionano allo stesso modo
Kun

10

Una nota di chiarimento riguardava raramente:

I backtick (a volte chiamati anche Graves perché raddoppiano come accento comune in francese e in altre lingue) sostituiscono solo l'output standard , ma non l'errore standard.

Quindi, per continuare l'esempio precedente:

file `which hostname`

funzionerà come previsto, ma in:

file `which hostnameX`

whichrestituirà un errore e quell'output passa all'errore standard, invece di sostituirlo nella riga di comando accanto file; non ci sarà alcun output standard, che puoi confermare eseguendo:

which hostnameX

which hostnameX 2>/dev/null

In questo caso,

file `which hostnameX` 

produrrà due messaggi di errore (il primo, a causa which hostnameXe il secondo subito dopo il primo, a causa del file stesso, che rileva che il nome del file è mancante e quindi l'intero comando

essenzialmente ridurrà a solo:

file

che, ovviamente, è un cattivo utilizzo e restituirà un errore di utilizzo.

(se vuoi controllarlo da solo puoi provare:

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)

4

Il backtick `esegue il contenuto della stringa racchiusa, quindi qualcosa del genere

file `which hostname`

scoprirà il percorso del comando hostname e ti dirà come è stato creato.

Il comando inserito nella domanda viene eseguito id -uper ottenere l'ID utente effettivo, quindi cambia la proprietà di / somedir per quell'utente.


2

Questo simbolo significa che qualunque cosa al suo interno viene interpretata come il risultato di quel comando.

per esempio:

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three

Quanto sopra risulta nella threedirectory copiata nella mia /homedirectory.


1

I backtick assomigliano alla sostituzione dei comandi. Questa sintassi backtick è arcaico, e conosce il simbolo del dollaro con due parentesi è comune: $().

Che cos'è la sostituzione dei comandi?

La sostituzione dei comandi è una singola operazione con sintassi dedicata sia per eseguire un comando sia per avere l'output memorizzato in una variabile per un uso successivo.

Un esempio con data:

thedate=$(date)

Potremmo quindi stampare il risultato: 'La data è% s \ n' "$ thedate" `.

  1. La sintassi di sostituzione del comando è $().
  2. Il comando stesso è date.
  3. Combinando entrambi otteniamo $(date)quale il suo output è la sostituzione.
  4. Visualizziamo il valore di output trattenuto dalla variabile con printf, per il comando sopra.
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.