web-dev-qa-db-ja.com

パススラッシュ後のbashブレース展開

ブレース展開を使用して、ファイルを別の名前で同じディレクトリにコピーしようとしています。私はbash 4.4.18を使用しています。

これが私がしたことです:

cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}

しかし、私はこのエラーを受け取ります:

cp: cannot stat '/home/xyz/some/dir/{my-file-to-rename.bin,': No such file or directory

このような単純なブレース展開でも同じエラーが発生します。

cp {my-file-to-rename.bin, new-name-of-file.bin}

何が悪いのですか?

12
nanangarsyad

ブレース展開 構文はコンマを受け入れますが、コンマの後のスペースは受け入れません。多くのプログラミング言語では、コンマの後のスペースは当たり前ですが、ここにはありません。 Bashでは、引用符で囲まれていないスペースが存在するため、ブレースの展開を実行できません。

スペースを削除すると、機能します。

cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}

必須ではありませんが、末尾の.binを中括弧の外に移動できることに注意してください。

cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin

ブレース展開の効果をテストする場合は、echoまたはprintf '%s '、または printf を使用して、任意のフォーマット文字列を使用して、それ。 (私がBashにいるときは、個人的にはechoを使用します。これは Bashのechoビルトイン がデフォルトでエスケープシーケンスを拡張しないため、かなり適切です。実際に実行されるコマンドを確認するのに適しています。例:

ek@Io:~$ echo cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
cp /home/ek/some/dir/my-file-to-rename.bin /home/ek/some/dir/new-name-of-file.bin
29
Eliah Kagan

string{foo, bar}はブレース展開ではありません。 2つの単語string{foo,およびbar}。ブレース展開を使用するには、ブレースが同じWord内にある必要があります。不要な場合は余分なスペースを削除するか、必要な場合は引用符で囲む必要があります。

$ printf "%s\n" aa{bb, cc}
aa{bb,
cc}
$ printf "%s\n" aa{bb,cc}
aabb
aacc
$ printf "%s\n" aa{bb," cc"}
aabb
aa cc
23
ilkkachu