エコー「aaa」>abc.1.txt エコー「bbb」>abc.2.txt cp abc*
Linux エラーなし
バグ 同じコマンド [ cp abc.1.txt abc.2.txt]
cp abc.* = cp abc.1.txt abc.2.txt
なぜ?
答え1
これはバグではなく、シェル変数式の意図された動作です。
ulrich-schwarz が正しく述べているように、変数の展開はcp
コマンドが実行される前に行われます。式の条件を満たすファイルが 2 つあるabc*
ため、完全な名前に展開されます。
実際、3 番目のファイルを作成すると、abc.3.txt
その 3 つのファイルを のパラメータとして使用しようとしますcp
。
コマンドを実行する前にデバッグ ( set -x
) モードを設定すると、展開後に実行される実際のコマンドが表示されるため、これらすべてを確認できます。終了したら、デバッグ モード ( ) を無効にすることを忘れないでくださいset +x
。
$ echo "aaa" >abc.1.txt
$ echo "bbb" >abc.2.txt
$ ls
abc.1.txt abc.2.txt
$ set -x
$ cp abc*
+ cp abc.1.txt abc.2.txt
$ cat abc.2.*
+ cat abc.2.txt
aaa
$echo "ccc" > abc.3.txt
+ echo ccc
$ cp abc*
+ cp abc.1.txt abc.2.txt acb3.txt
cp: target «acb3.txt» is not a directory
$ cat abc.2.*
+ cat abc.2.txt
aaa
$ cat abc*
+ cat abc.1.txt abc.2.txt abc.3.txt
aaa
aaa
ccc
$ set +x
+ set +x