web-dev-qa-db-ja.com

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

次の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!
12
Ambidex

Bashは 一連の展開beforeコマンドが実行されます(この場合はSudo)。最初のケースでは、コマンド置換は二重引用符で囲まれているため実行されます。コマンド置換はユーザーと同じように実行されるため、エラーが発生します。 2番目のケースでは、一重引用符が展開を妨げるため、ルートのシェルが実行されるまでバックティックは置き換えられません。

参照 https://www.gnu.org/software/bash/manual/bashref.html#Quoting

19
glenn jackman

最初の例では、バックティックはシェルによって評価されます(ルートではなくあなたとして)。で試してみてください

Sudo su -c "echo `whoami`"

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

6
Matteo