bashがディレクトリとは異なる方法でシンボリックリンクを完成させるのはなぜですか?

bashがディレクトリとは異なる方法でシンボリックリンクを完成させるのはなぜですか?

私はソースコードを検索するときに主にfind環境変数をパスとして使用します。最近、環境変数をシンボリックリンクに置き換えました。これにより、Bashのシェルの完成が中断されました。シンボリックリンクを使用すると機能しfindませんが、シンボリックリンクが指す実際のパスを使用して見つけることができます。

ln -s /some/source/dir /the/source
export SYMLINK=/the/source
export DIR=/some/source/dir

find $SYMLINK -name file.c        // doesn't find anything
find $DIR -name file.c            // works as expected

この例では、$ SYMLINKは$ DIR値へのシンボリックリンクです。

それでは、BashがSymlink環境変数を異なる方法で処理するのはなぜですか?

答え1

これは bash ではなく find です。ほとんどのユーティリティが同じ原則に従うことがわかります。

  • ファイルの内容を操作する場合、通常のファイルへのシンボリックリンクは実際のファイルと同じです。
  • ディレクトリエントリに対して操作を実行する場合、シンボリックリンクは独自のカテゴリです。

これを実行すると、ディレクトリではなくfind $SYMLINKオブジェクトfindが表示されるため、ディレクトリに移動しません。ディレクトリへのシンボリックリンクをそのディレクトリとして扱うには、/末尾にを追加します(一部の破損したシステムまたはコマンドにはこれが必要な場合があります"$SYMLINK/.")。

find "$SYMLINK/" -name file.c

場合は、ターゲットを指定したように、コマンドラインからすべてのシンボリックリンクを処理するように指示するfindこのオプションを使用することもできます。-H

find -H "$SYMLINK" -name file.c

答え2

bashそうではありませんfind。再帰ディレクトリの巡回でシンボリックリンクをたどると、無限ループが発生します(ln -s foo .互換性パスを提供する一般的な方法を検討してください)。 POSIXにはそれを上書きする述語がfind含まれています-follow。おそらくこの場合はもっと便利です。 GNU findは、-Hナビゲーション中に検出されたシンボリックリンク拡張を避けながら、引数として直接指定されたシンボリックリンクのみを追跡します。エイリアスと組み合わせて使用​​できます。

alias find='find -H'

関連情報