Risposte:
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 chown
nei 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.
$()
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
).
$( )
è sicuramente più facile da scrivere che ` `
almeno su una tastiera francese.
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.
$(...)
nidifica meglio.
$()
e "``"
non funzionano allo stesso modo
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`
which
restituirà 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 hostnameX
e 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 :)
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 -u
per ottenere l'ID utente effettivo, quindi cambia la proprietà di / somedir per quell'utente.
I backtick assomigliano alla sostituzione dei comandi. Questa sintassi backtick è arcaico, e conosce il simbolo del dollaro con due parentesi è comune: $()
.
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.
thedate=$(date)
Potremmo quindi stampare il risultato: 'La data è% s \ n' "$ thedate" `.
$()
.date
.$(date)
quale il suo output è la sostituzione.printf
, per il comando sopra.
$(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 iltouch
comando