Diferencia al usar backticks en comillas dobles y comillas simples en Bash

12

¿Por qué las dos ejecuciones siguientes difieren en la salida? (Necesito comillas dobles para las variables en mi comando eventual)

$ 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
fuente

Respuestas:

19

Bash realiza una serie de expansiones antes de ejecutar el comando ( sudoen este caso). En el primer caso, la sustitución del comando se realiza porque está entre comillas dobles: se ejecuta como usted, de ahí el error. En el segundo caso, las comillas simples evitan expansiones, por lo que los backticks no se sustituyen hasta que se ejecuta el shell de root.

Consulte también https://www.gnu.org/software/bash/manual/bashref.html#Quoting

Glenn Jackman
fuente
6

En el primer ejemplo, su shell evalúa los backticks (como usted y no como root). Probar con

sudo su -c "echo `whoami`"

En la segunda con comillas simples, 'la cadena completa echo `cat /root/root_file`se pasa al shell raíz.

Matteo
fuente