更新:私は間違っていることに気づきましたが、それを修正する方法がわかりません。
たとえば、bash -c " echo "$S" "
完全bash -c ' echo "$S" '
に異なる出力を提供します。しかし、私が現在知っている知識では正しい結論を下すのに十分ではありません。
タイトルがちょっと乱雑に感じられるかもしれませんが、
たとえば、基本的にbash -c ' echo " smth " '
自分で使用するためにecho
一重引用符が必要な場合'
echo ' #!$smth '
次に、二重引用符または別の一重引用符bash -c
に切り替える必要があります。"
echo
だからbash -c " echo ' #!$smth ' "
bash -c
一重引用符でも二重引用符でも、違いはありません。
私の理解は正しいですか?または自由に修正してください。
ありがとうございます。
答え1
二重引用符で囲まれた変数や引用符のない変数 ($S や "$S" など) は、現在のシェルで拡張されます。文字列を一重引用符で囲むと、文字通り(一重引用符を除く)子プロセスに渡されます。あなたの例では
...
---> parent-shell
------> child-shell (bash -c)
------> echo command executed in child shell.
最初の例では、$ Sは親シェルで拡張されています。 2番目の例では、$ Sは未定義のサブシェルからnullに展開されます。 S変数をエクスポートすると、サブシェルに渡すことができます。例:
[me] S=foo
[me] bash -c " echo "$S" "
foo
[me] bash -c ' echo "$S" '
[me] export S
[me] bash -c ' echo "$S" '
foo
[me]