web-dev-qa-db-ja.com

「cat {foo}」がfooを出力しないのに、「cat {foo、bar}」が出力するのはなぜですか?

テキストファイルをサブフォルダーに連結しようとして、次のことを試みました。

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

しかし、これは何も返しませんでした。だから、存在しない「サブフォルダ2」を追加してみた

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

そして今回はうまくいき、ファイルを正常に連結しました。なぜこれが起こるのですか?

12
CDPF

定義により、GNU Bashのブレース展開には、シーケンス式または一連のコンマ区切り値のいずれかが必要です。

ブレース展開されるパターンは、オプションのプリアンブルの形式を取り、その後に一連のコンマ区切りの文字列または中括弧のペア間のシーケンス式が続き、その後にオプションのポストスクリプトが続きます。

詳細は マニュアルを読む を参照してください。

いくつかの簡単なサンプル:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2
22
Arthur Hess

{subfolder1}は代替がないため、{subfolder1}と評価されます。代わりにsubfolder1を使用してください。

ブレースは、コマ区切りの文字列がある場合にのみ展開されます。 {abc、def}または範囲、たとえばそれらの間に指定された{a..e}.

あなたの場合、それを必要としないので、中括弧で囲まずにサブフォルダ1を書くだけです

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var
1
Neo_Returns