シェルスクリプトでファイル名のワイルドカードが失敗し続けます。

シェルスクリプトでファイル名のワイルドカードが失敗し続けます。

想像する:mongodbダンプを復元するためにdockerコンテナにログインしています。このボリュームにはダンプファイルが1つしかありません。

ファイル名にワイルドカードを使用すると、次のエラーが発生しますが、ファイル名全体を指定すると機能します。フォーラムの検索に数時間を費やしましたが、回答が見つかりませんでした。私のスクリプトに何がありましたか?

root@141782f66c37:/data/backup# ./mongoretore.sh
./mongoretore.sh: line 2: dump_06-11-2020_20-32-15.dump: command not found
./mongoretore.sh: line 2: `*.dump`: ambiguous redirect

布材

#!/bin/bash
mongorestore --drop --archive < dump_06-11-2020_20-32-15.dump

動作しない

#!/bin/bash
mongorestore --drop --archive < `*.dump`

ベストアンサー1

... < `*.dump`

ここで、リダイレクト演算子の次の部分はコマンドの置き換えです$(*.dump)。これは、内部的にシェルボールなどのより近代的な構文を使用して作成するのが最善です。 globはglobで終わるすべてのファイル名を拡張し、.dumpそれをコマンドとして実行します。

あなたの場合、生成されたコマンドdump_06-11-2020_20-32-15.dump自体は一致する唯一のファイルであり、他のファイルがある場合は別のファイル名が続きます。いずれの場合も、コマンドPATHにその名前のコマンドが含まれていないため、シェルでエラーが発生します。その後、リダイレクトが失敗したため、別のエラーが発生します。それはおそらく、コマンド置換が空の文字列を出力するからです。

x=
... < $x

今質問は何をしたいですか。通常、*現在のディレクトリが通常は場所にないため動作しないPATHため、通常のコマンドを使用して作業ディレクトリからファイルを実行しようとしません。既知の名前のファイルのみを読みたい場合は、正しい構文はバックティックがないことです。

... < filename.dump

あるいは、ファイル名はわかりませんが、ファイル名が1つしかないことがわかっている場合は、globを使用できます。

... < *.dump

この機能は、ディレクトリに一致するファイルが1つしかない限り機能します。これを超えると、ambiguous redirectBashはユーザーがどの項目を読みたいかを知らないため、エラーが発生します。

複数のファイルがある場合は、そのファイルで何をするかを決定する必要があります。各ファイルに対してコマンドを一度実行し、各ファイルの入力を順番にリダイレクトしますか?または、コマンドを合計1回実行し、ファイルの1つから入力をリダイレクトしますか?しかし、どれ?

おすすめ記事