GNU bashバージョン3.2.48にはこのバグがあります。バージョン 3.2.57 は使用できなくなりました。
8000の同じ行を含むファイルを作成します(各行が書き込まれると仮定1
)。split -a3 -p "1"
run on it (与えられたパターンに従って分割する-p
BSD オプションです。 1 行に 1 行しかないファイルの場合は、実行して標準と同じ操作を実行できます)。split
1
split
split -a3 -b 1
find . -name xaaa -exec echo {} +
予想された出力の後にfind: fts_read: Invalid argument
は に出力されます。cerr
ファイルセットと他のコマンドをxaaa
置き換えると同じエラーが発生します。echo
ファイル名の長さは重要ではありません。ファイルのディレクトリも重要ではありません。
他の場所でいくつかのファイルを生成した後、エラーは消えました。ただし、複数のファイルを含む別のワイルドカード(または少なくとも1つがディレクトリリストの先頭にあります)xaaa
に置き換えると、エラーが再発生します。xaa*
現時点では、エラーを引き起こす単一のファイルはありません。
+
次のように置き換えると;
エラーは防止されますが、私のスクリプトでは許可されていません。この問題は私のスクリプトの他の場合に断続的に発生しましたが、問題を減らすことでそれを複製する簡単な方法を見つけることができました。
エラーが発生した場合はスクリプトを停止したいが、これを行うとスクリプトが頻繁に停止します。この問題を解決する方法を知っていますか? (たとえば、エラーコードを検索してこの特定のエラーを無視します。)
Mac OSバージョン10.8.5。ダーウィンカーネルバージョン12.5.0。
答え1
bashが関連する可能性はほとんどありません。
Bashの役割は、このコードを解析し、、、、、、、を使用してfind . -name xaaa -exec echo {} +
実行に変換することです。すべてのbashバージョンは同じことを行います。/path/to/find
find
.
-name
xaaa
-exec
echo
{}
+
ここでfind:
エラーメッセージの接頭辞として、エラーはによるものではなくによるfind
ものですbash
。特に、関数から返されたエラーについてですfts_read()
。
macosfind
は FreeBSD バージョンで、Apple で修正した可能性があります。
ありがたいことに、FreeBSD(Macosではない場合)はFLOSSで、比較的見つけるのは簡単です。エラーがコードに出力されます。。
/*
* find_execute --
* take a search plan and an array of search paths and executes the plan
* over all FTSENT's returned for the given search paths.
*/
int
find_execute(PLAN *plan, char *paths[])
[...]
e = errno;
finish_execplus();
if (e && (!ignore_readdir_race || e != ENOENT))
errc(1, e, "fts_read");
return (exitstatus);
}
関数が終わったらfind_execute
。
ここで私たちは以下を得ます:
find: fts_read: Invalid argument
Invalid argument
errnoに対応するエラーメッセージEINVAL
。
ここで呼び出しが行われる前のループの条件文で as が 0errno
に設定されており、fts_read
ループを終了するので、this 手段だけが返されます。errno
while
fts_read
fts_read
NULL
見たらマニュアルページfts_read
、あなたは見つけるでしょう:
関数
fts_read()
とfts_children()
は失敗する可能性があり、errno
ライブラリ関数とで指定されたエラーを設定できます。chdir(2)
malloc(3)
opendir(3)
readdir(3)
stat(2)
これらのリンクに沿って別のマニュアルページに移動すると、そのいずれもEINVALを返しません。
find
したがって、Appleやfts
ライブラリのバグと非常によく似ています。コードにアクセスできない場合は、私たちができることはあまりありませんので、この問題をAppleサポートに提出することをお勧めします。