答え1
バックティックはバックスラッシュの二重処理を効果的に提供します。 (注コマンドライン処理時は1回、コマンド置換コマンド処理時は1回)
Kusalandaが言ったように、これは$(..)
コマンドの置き換えとは異なります。
echo
まず、基本的にバックスラッシュエスケープを基本的に処理しない Bashについて話しているようです。たとえば、whichはwhich printsにecho '\\'
渡されます。バックスラッシュ自体を処理する機能(Bash with Dashやzshなど)を使用すると、最後のバックスラッシュが出力されます。\\
echo
\\
echo
shopt -s xpg_echo
\\
\
\z
以前のスタイルのバックティック代替フォーマットを使用する場合、バックスラッシュは、後に「ドル記号、バックティックまたはバックスラッシュ」が続かない限り、文字通りの意味を維持します。
だからコマンドで
echo `echo \\\\\\\z` # 7 backslashes
ペアは\\
最初に単一\
sに縮小され、\z
そのまま残ります\z
(3つのうちどれも後に来ないため、バックスラッシュは文字通りです)。その後、バックティック内のコマンドはシェルを再実行します。
したがって、コマンド置換コマンドは最終的に次のようになります。
echo \\\\z # 4 backslashes
ここで\\
ペアは単一の\
sに縮小され、引数は次のecho
とおりです\\z
(2つのsを介して変更されていない状態で印刷するecho
、上記の警告を参照)。
ドル記号を使用しても同様の結果が表示されます。たとえば、次のようになります。
var=foo
echo `echo \$var`
印刷foo
。
echo `echo '\$x'`
印刷$x
。 (一重引用符は保護されていません$
。)
より合理的な形式のコマンド置換は、$(...)
その内容が一度だけ処理されるということです。
echo $(echo \\\\\\\z) # 7 backslashes
(3)を印刷\\\z
し、
var=foo
echo $(echo \$var)
印刷$var
。
また見なさい:
答え2
初期のechoコマンドはシェルで処理されるため、倍数を正しく確認して\
くださいecho \\\z
。
この時点で、シェルはもはや関連していません。
echoコマンドは\\\
これを確認して単一に短縮します\
。つまり、リテラルが必要です\
。
end をエスケープする必要がないので、\
に縮小できます\\\z
。