二重引用符コマンドの置き換えは良い習慣です。プロセス置換(<()
and)は同じですか>()
?
二重引用符はコマンド置換を許可しますが、プロセス置換は許可しないようです。
$ echo <(printf "%s" hello)
/dev/fd/63
$ echo "<(printf "%s" hello)"
<(printf %s hello)
プロセス置換の結果にスペースが含まれている場合、またはこれが発生しない場合はどうなりますか?
ありがとうございます。
答え1
簡単にテストしたように、参照プロシージャの置き換えはこれを抑制します。
$ echo <(echo 123)
/dev/fd/63
$ cat <(echo 123)
123
$ echo "<(echo 123)"
<(echo 123)
$ cat "<(echo 123)"
cat: '<(echo 123)': No such file or directory
私が質問する前にこれを試していないことは私にとっては奇妙ですが、今はそれがうまくいかないことを少なくとも簡単に確認できます。
echo "("
これは、同じトークンで別のシェル演算子を参照するときに発生するものと変わりません。これは構文エラーではなく、echo "> /dev/sda"
問題を引き起こしません。
これファイルに書き込む動作は次のとおりです。
ファイル名は拡張の結果として現在のコマンドに引数として渡されます。
単一の引数でスペースの有無は重要ではなく、トークン化は関係なく実行されません。一部のプラットフォームでは、生成されたパスにスペースが表示される場合がありますが、これは効果がありません。
答え2
Bashで文字列を囲むとき二重引用符、次の特殊文字のうち1つ以上が含まれていない限り、リテラルとして解釈されます。
$ ` \ ! * @
<(command_list)
プロセス置換構文は二重引用符で解釈できません。テキスト以外と解釈される文字は含まれません。二重引用符は構文解析を許可しないため、プロセスの置き換えを防ぐために必要です。
コマンドの代替構文は次のとおりです。
$(command)
# or
`command`
どちらも$
二重引用符(または逆引用符)内の特殊文字で始まりますが、ご存知のように二重引用符はコマンドの置き換えを抑制しません。
これは、二重引用符が特定の動作を抑制するかどうかを予測する場合に考慮する最初の規則です。構文にこれらの6文字のいずれかが含まれていない場合は、二重引用符で抑制する必要があります(中括弧拡張、チルダ拡張、プロセス置換、単語区切り文字の使用、これらの文字は二重引用符内には表示されません)。もちろん、これらの6文字のうちの1つに関連するすべての構文が二重引用符で囲まれているわけではありませんが、考慮すべき最初の規則です。この回答と規則は、すべての状況に直面する前に予測し、覚えておくように設計されています。二重引用符内の構文を解釈できない場合、この動作は発生しません。