Разница при использовании обратных кавычек в двойных кавычках и одинарных кавычек в Bash

12

Почему следующие два исполнения отличаются по выводу? (Мне нужны двойные кавычки для переменных в моей возможной команде)

$ 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
источник

Ответы:

19

Bash выполняет серию расширений перед выполнением команды ( sudoв данном случае). В первом случае подстановка команды выполняется потому, что она в двойных кавычках - она ​​выполняется как вы, отсюда и ошибка. Во втором случае одинарные кавычки предотвращают расширение, поэтому обратные кавычки не подставляются, пока не будет запущена оболочка root.

Смотрите также https://www.gnu.org/software/bash/manual/bashref.html#Quoting.

Гленн Джекман
источник
6

В первом примере обратные пометки оцениваются вашей оболочкой (как вы, а не как root). Попробуй с

sudo su -c "echo `whoami`"

Во втором с одинарными кавычками 'вся строка echo `cat /root/root_file`передается в корневую оболочку.

Matteo
источник