O que significa '(backquote / backtick) em comandos?

136

Eu me deparei com o seguinte comando:

sudo chown 'id -u' /somedir

e eu me pergunto: qual é o significado do símbolo ' . Notei, por exemplo, que, embora o comando acima funcione bem, o seguinte não:

sudo chown 'id -u' /somedir
    
por gws 22.12.2011 / 15:30

6 respostas

179

Este é um backtick . Um backtick não é um sinal de cotação. Tem um significado muito especial. Tudo o que você digita entre backticks é avaliado (executado) pelo shell antes do comando principal (como chown em seus exemplos), e a saída dessa execução é usada por esse comando, como se você digite essa saída naquele local na linha de comando.

Então, o que

sudo chown 'id -u' /somedir

efetivamente executado (dependendo do seu ID de usuário ) é:

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

Dê uma olhada em esta pergunta para saber por quê Em muitas situações, não é uma boa ideia usar backticks.

Btw, se você quiser usar um backtick literalmente, por exemplo. em uma string, você pode escapar colocando uma barra invertida ( \ ) antes.

    
por 22.12.2011 / 15:43
60

Eu gostaria de adicionar mais alguns pontos aqui.

O backtick '…' é, na verdade, chamado de substituição de comando . O objetivo da substituição de comando é avaliar o comando que é colocado dentro do backtick e fornecer seu resultado como um argumento para o comando real.

A substituição do comando pode ser feita de duas maneiras: uma está usando $(…) e a outra é '…' . Ambos funcionam da mesma forma, mas a forma $(…) é a maneira moderna e tem mais clareza e legibilidade.

E então

sudo chown $(id -u) /somedir

pode ser preferível ao outro.

E mais uma coisa que você precisa observar aqui é a substituição de comandos relacionamento com as regras de cotação de basquete como mencionado na bash < href="http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html"> documento .

If the substitution appears within double quotes, word splitting and filename expansion are not performed on the results.

    
por 03.11.2014 / 06:58
9

Uma nota de esclarecimento raramente abordada:

Backticks (às vezes também chamados de Graves porque funcionam como um acento comum em francês e em outros idiomas) substituem somente a saída padrão , mas não o erro padrão.

Então, para continuar o exemplo anterior:

file 'which hostname'

funcionará como esperado, mas em:

file 'which hostnameX'

which retornará um erro e essa saída vai para o erro padrão, em vez de substituir a linha de comando próxima a file ; não haverá saída padrão, o que você pode confirmar executando:

which hostnameX

which hostnameX 2>/dev/null

Nesse caso,

file 'which hostnameX' 

produzirá duas mensagens de erro (a primeira, devido a which hostnameX e a segunda logo após a primeira, devido ao próprio arquivo, que descobre que o nome do arquivo está faltando e assim, o comando inteiro

essencialmente reduzirá para:

file

que, obviamente, é um mau uso e retornará um erro de uso.

(se você quiser verificar por si mesmo, você pode tentar:

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 :)
    
por 12.10.2015 / 17:30
3

O backtick 'executa o conteúdo da string anexada, então algo como isto

file 'which hostname'

descobrirá o caminho para o comando hostname e, em seguida, informará como ele foi criado.

O comando que você coloca na sua pergunta executa id -u para obter o ID de usuário efetivo e, em seguida, altera a propriedade de / somedir para esse usuário.

    
por 22.12.2011 / 15:41
2

Este símbolo significa que o que estiver dentro dele é interpretado como o resultado desse comando.

por exemplo:

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

Os resultados acima no diretório three que está sendo copiado para o meu diretório /home .

    
por 22.12.2011 / 15:41
0

Os backticks lembram a substituição de comandos. Essa sintaxe de backticks é arcaica, e saber que o cifrão com dois parênteses é comum: $() .

O que é substituição de comando?

A substituição de comandos é uma única operação com sintaxe dedicada para executar um comando e ter sua saída armazenada em uma variável para uso posterior.

Um exemplo com data:

thedate=$(date)

Poderíamos então imprimir o resultado: "A data é% s \ n '" $ thedate "'.

  1. A sintaxe de substituição de comandos é $() .
  2. O comando em si é date .
  3. Combinando ambos, obtemos $(date) , cuja saída é a substituição.
  4. Exibimos o valor de saída retido pela variável com printf , conforme o comando acima.
por 11.06.2018 / 18:29

Tags