Respostas:
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.
$()
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, inclusive Shift
).
$( )
é 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
sudo chown $(id -u) /somedir
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 .
Se a substituição aparecer entre aspas duplas, a divisão de palavras e a expansão do nome do arquivo não são executadas nos resultados.
$(...)
ninhos melhor.
$()
e "``"
não funcionam da mesma maneira
Uma 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:
file `which hostname`
funcionará conforme o esperado, mas em:
file `which hostnameX`
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 de 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á ausente e, portanto, todo o comando
reduzirá essencialmente para apenas:
file
que, é claro, é um mau uso e retornará um erro de uso.
(se você quiser verificar por conta própria, 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 :)
O backtick `executa o conteúdo da string incluída, então algo como isto
file `which hostname`
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.
Os backticks se assemelham a substituição de comando. Esta sintaxe backticks é arcaico, e saber o cifrão com dois parênteses é comum: $()
.
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.
thedate=$(date)
Poderíamos então imprimir o resultado: 'A data é% s \ n' "$ thedate" `.
$()
.date
.$(date)
qual é a sua substituição.printf
, conforme o comando acima.
$(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