bashルールで減少するのではなく、straceのバックスラッシュ数が増加するのはなぜですか?

bashルールで減少するのではなく、straceのバックスラッシュ数が増加するのはなぜですか?

この質問は以下に関連しています。printfを使用してバックスラッシュと改行文字を印刷するには?、OPは\\\n単一のバックスラッシュと改行文字(リテラルではない\n)で印刷しようとします。

\\シェルの規則に従って拡張するのは合理的\ですが(つまり、シェルは後続の文字のリテラル形式を保存するためにバックスラッシュエスケープを実行します)、これを実行すると、シェルはまったく異なる操作を実行するようです。私が見ていることを説明するために。\nnstrace

$ strace -e execve printf "\\\n"
execve("/usr/bin/printf", ["printf", "\\\\n"], [/* 42 vars */]) = 0
\n+++ exited with 0 +++

つまり、私が見ているのは、argvシステムコール部分に入る文字数がexecve減るのではなく、追加のバックスラッシュが追加されて実際に増加するということです。

一重引用符を渡すのは '\\\\n'はるかに混乱しています。

$ strace -e execve printf '\\\\n'
execve("/usr/bin/printf", ["printf", "\\\\\\\\n"], [/* 42 vars */]) = 0
\\n+++ exited with 0 +++

つまり、ここのシェルが前のコマンドで変更されていなかったすべてを渡して、printfexecve()同じ出力を得るようにしたいのですがprintf "\\\n"異なります。

ある意味、私は理解を中心に頭を包み込むようです。純粋な printfそれ自体(システムによって実行されます)\\\nセクションの引数をバックスラッシュと改行文字として解釈します。また、シェルはユーザーが入力した内容を独自の規則に一致するように変換する必要がありますが、複数のバックスラッシュで正確に何が起こっているのかを言葉で表現するのが困難です。 argvexecve()\\\n

ベストアンサー1

strace\\単一のバックスラッシュがで表示され、改行文字がで表されるC文字列構文で文字列を表示します\n

渡されるのは、execveCソースコードから引数として印刷された文字列リテラルが与えられたときに関数が印刷する内容です。putsstrace

おすすめ記事