Diferença ao usar reticulares entre aspas duplas e aspas simples no Bash

12

Por que as duas execuções a seguir diferem na saída? (Preciso de aspas duplas para variáveis ​​no meu comando final)

$ sudo su -c "echo `cat /root/root_file`"
cat: /root/root_file: Permission denied
$ sudo su -c 'echo `cat /root/root_file`'
Yay, highly classified content!
Ambidex
fonte

Respostas:

19

O Bash realiza uma série de expansões antes que o comando seja executado ( sudoneste caso). No primeiro caso, a substituição do comando é executada porque está entre aspas duplas - é executada como você, daí o erro. No segundo caso, as aspas simples impedem expansões, portanto os reticulares não são substituídos até que o shell da raiz esteja em execução.

Veja também https://www.gnu.org/software/bash/manual/bashref.html#Quoting

Glenn Jackman
fonte
6

No primeiro exemplo, os backticks são avaliados pelo seu shell (como você e não root). Tente com

sudo su -c "echo `whoami`"

No segundo com aspas simples, 'toda a cadeia echo `cat /root/root_file`é passada para o shell raiz.

Matteo
fonte