Bashで二重引用符と一重引用符でバックティックを使用する場合の違い


12

次の2つの実行の出力が異なるのはなぜですか?(最終的なコマンドの変数には二重引用符が必要です)

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

回答:


19

Bashは、コマンドが実行される前に一連の展開を 実行します(この場合)。最初のケースでは、コマンドの置換は二重引用符で囲まれているため実行されます-それはあなたのように実行されるため、エラーになります。2番目のケースでは、単一引用符が展開を妨げるため、ルートのシェルが実行されるまでバックティックは置換されません。sudo

https://www.gnu.org/software/bash/manual/bashref.html#Quotingも参照してください


6

最初の例では、バックルートはシェルによって(ルートではなくユーザーとして)評価されます。で試す

sudo su -c "echo `whoami`"

単一引用符で囲まれた2番目の'文字列でecho `cat /root/root_file`は、文字列全体がルートシェルに渡されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.