Me deparei com o seguinte comando:
sudo chown `id -u` /somedir
e me pergunto: qual é o significado do `
símbolo. Percebi, por exemplo, que, embora o comando acima funcione bem, o comando abaixo não:
sudo chown 'id -u' /somedir
Este é um truque . 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ê digitasse essa saída naquele local no linha de comando.
E daí
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 nesta pergunta para saber por que, em muitas situações, não é uma boa ideia usar backticks.
Aliás, se você quiser usar literalmente um backtick, por exemplo , em uma string, poderá escapar colocando uma barra invertida ( \
) antes dele.
$(your expression)
é a melhor maneira de fazer a mesma coisa que$()
permite aninhar expressões. por exemplo:cd $(dirname $(type -P touch))
colocará você em cd no diretório que contém otouch
comando$()
na maioria das situações, isso não torna os backticks uma coisa pior . Para fins práticos, é preciso admitir que eles são muito mais rápidos para digitar na linha de comando (2 pressionamentos de tecla comparados a pelo menos 5, inclusiveShift
).$( )
é definitivamente mais fácil digitar do que` `
pelo menos em um teclado francês.Eu gostaria de acrescentar mais alguns pontos aqui.
O backtick
`…`
é 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
$(…)
e outra`…`
. Ambos funcionam da mesma forma, mas a$(…)
forma é moderna e tem mais clareza e legibilidade.E entao
pode ser preferido sobre o outro.
E mais uma coisa que você precisa observar aqui é o relacionamento de substituição de comando com as regras de cotação do bash, conforme mencionado no documento do bash .
fonte
$(...)
ninhos melhor.$()
e"``"
não funcionam da mesma maneiraUma nota de esclarecimento raramente abordada:
Backticks (às vezes também chamados de Graves, porque também serve como sotaque comum em francês e outros idiomas) substituem apenas a Saída padrão , mas não o Erro padrão.
Então, para continuar o exemplo anterior:
funcionará conforme o esperado, mas em:
which
retornará um erro e essa saída será um erro padrão, em vez de ser substituída na linha de comando ao lado defile
; não haverá saída padrão, o que você pode confirmar executando:Nesse caso,
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á ausente e, portanto, todo o comandoreduzirá essencialmente para apenas:
que, é claro, é um mau uso e retornará um erro de uso.
(se você quiser verificar por conta própria, pode tentar:
fonte
O backtick `executa o conteúdo da string incluída, então algo como isto
descobrirá o caminho para o comando hostname e, em seguida, informará como foi construído.
O comando que você coloca em sua pergunta é executado
id -u
para obter o ID do usuário efetivo e altera a propriedade de / somedir para esse usuário.fonte
Este símbolo significa que tudo o que está dentro é interpretado como resultado desse comando.
por exemplo:
O resultado acima resulta no
three
diretório sendo copiado para o meu/home
diretório.fonte
Os backticks se assemelham a substituição de comando. Esta sintaxe backticks é arcaico, e saber o cifrão com dois parênteses é comum:
$()
.O que é substituição de comando?
A substituição de comando é uma operação única com sintaxe dedicada para executar um comando e ter sua saída armazenada em uma variável para uso posterior.
Um exemplo com data:
Poderíamos então imprimir o resultado: 'A data é% s \ n' "$ thedate" `.
$()
.date
.$(date)
qual é a sua substituição.printf
, conforme o comando acima.fonte