Quel est le but de cd `(backtick)?

56

Ce qui suit se comporte de la même manière dans Fedora et CentOS.

cd mydirectory

travaux.

cd notadirectory

fonctionne (obtient une erreur de Bash).

cependant,

cd `

me donne une sorte d'invite:

>

Rien que je pensais entrer n'apporte de réponse, il se dirige simplement vers la ligne suivante pour l'inviter à nouveau. J'utilise simplement CTRL+ Cpour revenir à ma page root@localhost.

Quel est le but de ceci et que peut-on en faire?

Merci!

Mooseman
la source
6
Votre question porte donc plus sur le >backtick que sur le backtick, car cela peut également se produire dans d'autres situations
Tobias Kienzler le

Réponses:

123

Ce que vous avez tapé est un backtick - c'est le début d'une instruction à bash pour évaluer ce que vous tapez en tant que commande. Le >symbole est affiché pour indiquer que vous entrez toujours la commande sur la ligne suivante.

Si vous fermez le backtick, vous verrez que toute la commande sera exécutée. Par exemple

~$ cd `
> echo /var`
/var$
John C
la source
17
Vous pouvez même les imbriquer. Pour un exemple assez réaliste: cd `dirname \`which ls\``= cd dans le répertoire où se trouve le binaire "ls". (c'est à dire cd /bindepuis que c'est /bin/ls) [modifier: ouf, échapper à cette réduction est
difficile
54
Vous avez peut - être @MSalters trébuché sur la raison pour laquelle bash moderne préfère $()à ``. Votre exemple (plus la citation correcte) deviendrait cd "$(dirname "$(which ls)")"beaucoup moins fou.
Muzer
31
@Muzer Ce n'est pas simplement bash qui le préfère, mais il est recommandé, dans la spécification POSIX, d'utiliser des guillemets arrières $().
Étoile de mer
59

La réponse de JohnC explique déjà le backtick. Mais vous vous interrogez également sur l' >invite. Ceci est une invite de continuation, et elle est non seulement déclenchée par un backtick, mais toujours lorsque votre shell sait clairement que vous n'avez pas fini d'entrer une commande. L'exemple le plus simple consiste à placer une continuation de ligne explicite \à la fin d'une ligne d'entrée (ce qui permet de fractionner une entrée longue):

$ echo \
> hallo

Notez que, tout comme PS1les commandes de l'apparence de l'invite de commande, vous pouvez également définir PS2une modification de l'invite de continuation, par exemple:

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

Il y a plusieurs raisons pour que la continuation se produise. Un simple coup en arrière est incomplet, mais vous pouvez aussi entrer quelque chose comme

ls -l `which cp`

en une seule ligne (côté Nota: Il est recommandé d'utiliser $(et à la )place, puisque les parenthèses font évident où les rendent plus difficile commence l' expansion et se termine, en un seul contre - apostrophes pour voir où l' on ne manque et l' imbrication ....). Autres raisons possibles pour une invite de continuation:

  • une disparition doneaprès whileoufor
  • un manquant fiaprès unif
  • un manquant esacaprèscase
  • parenthèse fermante manquante, par exemple dans les sous-coques (cd $HOME; cat .bashrc)
  • une commande manquante après le piping |ainsi que l'exécution conditionnelle ||et &&(pas &si, puisque c'est juste que la commande s'exécute en arrière-plan)
  • un devis de clôture manquant ( 'ou ")

Curieusement, une accolade manquante }après une extension variable ${provoque également une invite de continuation, mais échouera à cause de l'espace inséré:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution
Tobias Kienzler
la source
2
Et la même chose se produit lorsque vous utilisez des guillemets :)
Steen Schütt Le
1
Je connaissais déjà la réponse à cette question lorsque je l'ai vue dans l'encadré, mais je voulais vous donner un extra, bien que imaginaire +1, pour une très belle réponse détaillée. C'est le type de contenu qui rend les sites StackExchange géniaux. Alors ... Merci et continue d'être génial.
Unkwntech
4

Cela signifie que votre commande n'est pas encore terminée. En fait, le caractère backtick,, `est utilisé pour délimiter une commande en ligne.

Exemple:

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

Le backtick commence / termine la substitution de commande. Le shell lit la commande à l'intérieur des backticks, interprète les résultats et place ces résultats dans la commande. Par exemple:. ls which cpentraîne l'exécution de "which cp" et le résultat de cette commande, c'est-à-dire que / bin / cp sera utilisé comme argument de la commande ls. Ce comportement est toutefois déconseillé, en faveur de la substitution plus explicite et lisible de la commande $ (cmd).

Lors de la saisie de cd `Le shell s'attend à ce qu'une commande soit exécutée pour être suivie, et être fermée avec un backtick.

Dans le cas du développement variable utilisant des accolades, le shell présente l'invite de continuation, car ces accolades sont évaluées lexicalement avant la fin du développement.

Nicole Stevens
la source