Qual é o objetivo do cd `(backtick)?

56

O seguinte se comporta da mesma forma no Fedora e no CentOS.

cd mydirectory

trabalho.

cd notadirectory

funciona (obtém um erro do Bash).

Contudo,

cd `

me dá algum tipo de prompt:

>

Nada do que eu pensei em entrar dá uma resposta, ele simplesmente segue para a próxima linha para solicitar novamente. Eu simplesmente uso CTRL+ Cpara voltar ao meu root@localhost.

Qual é o propósito disso e o que se pode fazer com isso?

Obrigado!

Mooseman
fonte
6
Então, sua pergunta é mais sobre o >que sobre a crase, uma vez que também pode ocorrer em outras situações
Tobias KIENZLER

Respostas:

123

O que você digitou é um backtick - é o início de uma instrução para bash para avaliar o que você digita como um comando. O >é exibido para indicar que você ainda está digitando o comando na próxima linha.

Se você fechar o backtick, verá que todo o comando será executado. Por exemplo

~$ cd `
> echo /var`
/var$
John C
fonte
17
Você pode até aninhá-los. Para um exemplo um tanto realista: cd `dirname \`which ls\``= cd para o diretório em que o binário "ls" está localizado. (ou seja, cd /binuma vez que é /bin/ls) [edit: ufa, escapando que remarcação é difícil]
MSalters
54
@MSalters Você talvez deparei com a razão pela qual o bash moderna prefere $()a ``. Seu exemplo (mais a citação correta) se tornaria cd "$(dirname "$(which ls)")"muito menos insana.
Muzer # 26/17
31
@Muzer Não é apenas o bash que prefere, mas é recomendado na especificação POSIX usar $()sobre aspas.
Starfish
59

A resposta de JohnC já explica o backtick. Mas o que você também está se perguntando é o >prompt. Isso é um prompt de continuação e não é apenas acionado por um backtick, mas sempre quando seu shell sabe claramente que você não terminou de digitar um comando. O exemplo mais fácil é colocar uma continuação de linha explícita \no final de uma linha de entrada (o que ajuda a dividir a entrada longa):

$ echo \
> hallo

Observe que, assim como PS1controla a aparência do prompt de comando, você também pode PS2alterar o prompt de continuação, por exemplo

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

Existem muitas razões para a continuação ocorrer. Um único backtick está incompleto, mas você também pode inserir algo como

ls -l `which cp`

em uma única linha (nota lateral: É recomendado para usar $(e )em vez disso, uma vez que os parênteses tornar óbvio que a expansão começa e termina, enquanto backticks individuais tornam mais difícil para ver onde um está desaparecido e aninhamento ....). Outras razões possíveis para um prompt de continuação:

  • uma falta donedepois whileoufor
  • uma falta fidepois de umif
  • uma falta esacdepoiscase
  • um parêntese de fechamento ausente, por exemplo, em subcascas (cd $HOME; cat .bashrc)
  • um comando ausente após a tubulação |, bem como a execução condicional ||e &&( &embora não , já que isso está apenas executando o comando em segundo plano)
  • uma cotação de fechamento ausente ( 'ou ")

Curiosamente, uma chave ausente }após uma expansão variável ${também causa um prompt de continuação, mas falhará devido ao espaço inserido:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution
Tobias Kienzler
fonte
2
E a mesma coisa acontece quando o uso de aspas :)
Steen Schütt
11
Eu já sabia a resposta para essa pergunta quando a vi na barra lateral, mas queria dar um +1 extra, embora imaginário, para uma resposta detalhada muito boa. Esse é o tipo de conteúdo que torna os sites StackExchange impressionantes. Então ... Obrigado e continue sendo incrível.
Unkwntech 27/04
4

Isso significa que seu comando ainda não está completo. De fato, o caractere backtick,, `é usado para delimitar um comando embutido.

Exemplo:

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

O backtick inicia / termina a substituição do comando. O shell lê o comando dentro dos backticks, interpreta os resultados e coloca esses resultados no comando. Por exemplo:. ls which cpresulta na execução de "qual cp" e o resultado desse comando, ou seja, / bin / cp será usado como argumento para o comando ls. Esse comportamento, no entanto, foi preterido, em favor da substituição de comandos $ (cmd) mais explícita e legível.

Ao digitar cd `O shell espera que um comando seja executado e siga com um backtick.

No caso da expansão variável usando chaves, o shell apresenta o prompt de continuação porque essas chaves são avaliadas lexicamente antes da expansão.

Nicole Stevens
fonte