Qual è lo scopo di cd `(backtick)?


56

Quanto segue si comporta allo stesso modo in Fedora e CentOS.

cd mydirectory

lavori.

cd notadirectory

funziona (ottiene un errore da Bash).

Però,

cd `

mi dà una sorta di prompt:

>

Nulla di ciò che ho pensato di inserire dà alcuna risposta, si dirige semplicemente alla riga successiva per richiedere nuovamente. Uso semplicemente CTRL+ Cper tornare al mio root@localhost.

Qual è lo scopo di questo e cosa si può fare con esso?

Grazie!



6
Quindi la tua domanda è più sulla questione >che sul backtick, poiché ciò può verificarsi anche in altre situazioni
Tobias Kienzler,

Risposte:


123

Ciò che hai digitato è un backtick : è l'inizio di un'istruzione per bash per valutare ciò che scrivi come comando. La >viene visualizzato per indicare che si sta ancora digitando il comando nella riga successiva.

Se chiudi il backtick scoprirai che verrà eseguito l'intero comando. Per esempio

~$ cd `
> echo /var`
/var$

17
Puoi persino nidificarli. Per un esempio un po 'realistico: cd `dirname \`which ls\``= cd nella directory in cui si trova il binario "ls". (cioè cd /bindal momento che è /bin/ls) [modifica: accidenti, sfuggire a quel ribasso è DURO]
MSalters

54
@MSalters quali hai forse inciampato sul motivo per cui bash moderno preferisce $()a ``. Il tuo esempio (più la citazione corretta) diventerebbe cd "$(dirname "$(which ls)")"molto meno folle.
Muzer,

31
@Muzer Non è solo bash che lo preferisce, ma è raccomandato nelle specifiche POSIX da usare $()sui backquotes.
Starfish,

59

La risposta di JohnC spiega già il backtick. Ma quello che ti stai chiedendo è anche il >prompt. Questo è un prompt di continuazione, e non è solo attivato da un backtick, ma sempre quando la tua shell sa chiaramente che non hai finito di inserire un comando. L'esempio più semplice è mettere una continuazione di riga esplicita \alla fine di una riga di input (che aiuta a dividere un input lungo):

$ echo \
> hallo

Si noti che proprio come PS1controlla l'aspetto del prompt dei comandi, è anche possibile impostare la PS2modifica del prompt di continuazione, ad es

$ export PS2="(cont.) "
$ echo \
(cont.) hallo

Ci sono molte ragioni per la continuazione. Un singolo backtick è incompleto, ma puoi anche inserire qualcosa di simile

ls -l `which cp`

in una sola riga (nota a margine: si consiglia di utilizzare $(e )invece, poiché le parentesi rendono ovvio dove inizia e finisce l'espansione, mentre i singoli backtick rendono più difficile vedere dove si manca. E nidificazione ...). Altre possibili ragioni per un prompt di continuazione:

  • un mancante donedopo whileofor
  • un mancante fidopo unif
  • un esacdopo mancantecase
  • una parentesi di chiusura mancante, ad es. in subshells (cd $HOME; cat .bashrc)
  • un comando mancante dopo il piping |, nonché l'esecuzione condizionale ||e &&(non &però, dal momento che sta solo facendo eseguire il comando in background)
  • una citazione di chiusura mancante ( 'o ")

Curiosamente, una parentesi graffa mancante }dopo un'espansione variabile ${provoca anche un prompt di continuazione, ma fallirà a causa dello spazio inserito:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution

2
E la stessa cosa accade quando si usano le virgolette :)
Steen Schütt,

1
Conoscevo già la risposta a questa domanda quando l'ho vista nella barra laterale, ma volevo darti un +1 extra, sebbene immaginario, per una risposta molto approfondita. Questo è il tipo di contenuto che rende fantastici i siti StackExchange. Quindi ... Grazie e continua ad essere fantastico.
Unkwntech,

4

Significa che il tuo comando non è ancora completo. In effetti, il carattere backtick `, viene utilizzato per delimitare un comando inline.

Esempio:

cd /tmp # Go to /tmp
pwd # Prints the current working  directory
ls `pwd` # Lists the content of the current working directory

0

Il backtick avvia / termina la sostituzione del comando. La shell legge il comando all'interno dei backtick, interpreta i risultati e li inserisce nel comando. Per esempio:. ls which cpdetermina l'esecuzione di "quale cp" e il risultato di quel comando, ovvero / bin / cp verrà utilizzato come argomento per il comando ls. Questo comportamento è, tuttavia, deprecato, a favore della sostituzione del comando $ (cmd) più esplicita e leggibile.

Quando si digita cd `La shell si aspetta che venga eseguito un comando da seguire e, da chiudere, con un backtick.

Nel caso dell'espansione variabile mediante parentesi graffe, la shell presenta il prompt di continuazione perché tali parentesi graffe vengono valutate lessicamente prima dell'espansione.

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.