Różnica w przypadku używania odwrotnych znaków w podwójnych cudzysłowach i pojedynczych cudzysłowów w Bash

12

Dlaczego następujące dwa wykonania różnią się wydajnością? (Potrzebuję podwójnego cudzysłowu dla zmiennych w moim ewentualnym poleceniu)

$ 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
źródło

Odpowiedzi:

19

Bash wykonuje serię rozszerzeń przed wykonaniem polecenia ( sudow tym przypadku). W pierwszym przypadku zastępuje się polecenie, ponieważ jest ono w podwójnych cudzysłowach - wykonuje się tak jak ty, stąd błąd. W drugim przypadku pojedyncze cudzysłowy zapobiegają ekspansjom, więc backsticks nie są zastępowane, dopóki nie uruchomi się powłoka roota.

Zobacz także https://www.gnu.org/software/bash/manual/bashref.html#Quoting

Glenn Jackman
źródło
6

W pierwszym przykładzie backsticks są oceniane przez twoją powłokę (jako ty, a nie root). Spróbuj z

sudo su -c "echo `whoami`"

W drugim z pojedynczymi cudzysłowami 'cały ciąg echo `cat /root/root_file`jest przekazywany do powłoki root.

Matteo
źródło