Différence lors de l'utilisation de guillemets doubles entre guillemets et de guillemets simples dans Bash

12

Pourquoi les deux exécutions suivantes diffèrent-elles en sortie? (J'ai besoin de guillemets doubles pour les variables dans ma commande éventuelle)

$ 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
la source

Réponses:

19

Bash effectue une série d'extensions avant l'exécution de la commande ( sudodans ce cas). Dans le premier cas, la substitution de commande est effectuée car elle est entre guillemets - elle s'exécute comme vous, d'où l'erreur. Dans le second cas, les guillemets simples empêchent les expansions, donc les backticks ne sont pas substitués tant que le shell de root n'est pas en cours d'exécution.

Voir aussi https://www.gnu.org/software/bash/manual/bashref.html#Quoting

glenn jackman
la source
6

Dans le premier exemple, les backticks sont évalués par votre shell (comme vous et non comme root). Essayez avec

sudo su -c "echo `whoami`"

Dans le second avec les guillemets simples, 'la chaîne entière echo `cat /root/root_file`est passée au shell racine.

Matteo
la source