テストコマンドがforループ変数によってブロックされるのはなぜですか?

テストコマンドがforループ変数によってブロックされるのはなぜですか?

ディレクトリ内の壊れたシンボリックリンクをすべて識別したいと思います。

より良い解決策を知らなかったので、私は次のような単純なbashの1行を試しました(bashバージョンは4.2.46で、ちょっと時代遅れなので、言及する価値があります)。

for f in $(ls); do test -L "$f" || continue; test -e "$f" || echo "$f deadlink"; done

残念ながら、これは機能しません。これを実行するとエラーを確認しようとします。

for f in $(ls); do test -L $f && echo "$f is a valid symlink"; done

有効なシンボリックリンクが存在しても出力は生成されません。同じコマンドを実行し、$f実際のファイル名に変更すると機能します。また、f=filename; test -L $f && echo "$f is a valid symlink";期待通りに動作するので、問題はループにあるようです。

私は何を見逃していますか?

答え1

ls問題は、出力に色を使用するときに発生するようです。あなたが以来解析されたls出力、色が出力されると、対応するエスケープコードがls指定された値で終わり、一致するファイルが見つかりません。この場合、テストは出力なしで失敗するため、もはや賢明ではありません。ftesttest

代わりにglobを使用してください。

for f in *; do test -L "$f" || continue; test -e "$f" || echo "$f deadlink"; done

バラより壊れたシンボリックリンクを見つける方法根本的な問題に対する他の考えられる解決策。

関連情報