Unterschied bei der Verwendung von Backticks in Anführungszeichen und einfachen Anführungszeichen in Bash

12

Warum unterscheiden sich die folgenden beiden Ausführungen in der Ausgabe? (Ich benötige doppelte Anführungszeichen für Variablen in meinem eventuellen Befehl.)

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

Antworten:

19

Bash führt eine Reihe von Erweiterungen durch, bevor der Befehl ausgeführt wird ( sudoin diesem Fall). Im ersten Fall wird die Befehlssubstitution ausgeführt, weil sie in doppelten Anführungszeichen steht - sie wird wie Sie ausgeführt, daher der Fehler. Im zweiten Fall verhindern die einfachen Anführungszeichen Erweiterungen, sodass die Backticks erst ersetzt werden, wenn die Shell von root ausgeführt wird.

Siehe auch https://www.gnu.org/software/bash/manual/bashref.html#Quoting

Glenn Jackman
quelle
6

Im ersten Beispiel werden die Backticks von Ihrer Shell ausgewertet (als Sie und nicht als root). Versuche es mit

sudo su -c "echo `whoami`"

In der zweiten mit den einfachen Anführungszeichen wird 'der gesamte String echo `cat /root/root_file`an die Root-Shell übergeben.

Matteo
quelle