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


12

私はサブフォルダ内のテキストファイルを連結しようとしていました:

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

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

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

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


2
echo代わりにcatを使用して、取得したコマンドラインを確認します。(またはset -xデバッグに使用します。)
ピーター

回答:


22

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

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

あなたはできるマニュアルを読むの詳細については。

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

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2


1

ブレースは、{abc、def}などのコマ区切り文字列や、{a..e}などの範囲が指定されている場合にのみ展開されます。

あなたの場合は、サブフォルダ1を書く必要があります。

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

残念ながら、2つの文字列と に/path/{a,}/filename展開されますが、これは望ましくない場合があります。/path/a/filename/path//filename
クサラナナンダ

@Kusalananda私を整流するためのおかげで、はいbashは警告saing「あいまいなリダイレクト」を提供します
Neo_Returns

いいえ、ambiguous redirect 引用符で囲まれていない値のない変数(たとえば)で指定されたファイルにリダイレクトしようとすると取得されますecho 'hello' >$idontexist
クサラナナンダ

1
...またはリダイレクトのファイル名が複数の単語に展開される場合。同様に> *.txt、複数持つ.txtファイル、または> $file場合は、$file空白文字が含まれています。しかし、もちろんあります与えることにあいまいな何もcat複数の引数を
ilkkachu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.