シンボリックリンクフォルダ内のシンボリックリンクの識別

シンボリックリンクフォルダ内のシンボリックリンクの識別

私がシンボリックリンクされた(ソフト)フォルダのサブフォルダ(または孫など)であるコンソールのサブフォルダにあるとしましょう。

サブフォルダでls -la何もしないと、すべてのファイルがSymlinkフォルダ内にあることが表示されます。

私はどのように知っていますか?現在これを確認するには、親フォルダに移動する必要があります。

ただし、これはエラールックアップをテストして、親(リンク)に達するまですべてのフォルダ階層をテストすることを意味します。

ベストアンサー1

一部のシンボリックリンクを介して現在の作業ディレクトリに移動したという事実は、シェル(Bashなど)でのみ追跡されます。ここに移動したパスは論理パスと呼ばれ、実際にはディレクトリへのシンボリックリンクであるディレクトリコンポーネントを含めることができます。すべてのシンボリックリンクが解決された後のパスは物理パスと呼ばれます。

現在のBashまたは組み込みツールではなく、シェルの現在の作業ディレクトリから別々のプロセスとして作成された場合、物理パスは運用ディレクトリであるため、そのディレクトリへの物理パスを自然に知ることができます。プロセスに関連するシステムパス(/proc/self/cwdプロセスの場合)。ツールは、PWDその環境で変数を調べるか、変数を調べるツールを使用して論理パスを調べることができます。変数の値は Bash から取得されます。

cdBashでは、組み込み関数はpwd物理パスまたは論理パスで動作できます。この回答pwdこれは組み込みではなく(たとえば)、その環境の変数を/usr/bin/pwd確認するため、論理パスのみを通知できます。PWDSymlink ディレクトリで以下を比較します。

$ env pwd -L
/logical/path
$ env pwd -P
/physical/path
$ env --unset=PWD pwd -L
/physical/path

pwdこれらのどれも組み込まれていません。独自envの組み込みシェルではなく、pwd組み込みではない実行可能ファイルのみを実行できます。PWD環境からそれを削除することによってpwd -L動作しますpwd -P

lsPWD環境には興味がありません。物理パスと論理パスの間に発生する可能性のある違いは、実行される操作とは何の関係もありませんls。違うべきだと思うかもしれません。質問の最初のバージョンでは、シンボリックリンクディレクトリ内のすべてのファイルがシンボリックリンクであると誤って仮定しました。この仮定を使用すると、lsこの事実を隠す追加の仮定をするのは簡単です。実際、ls一部の(物理)ディレクトリでは、シェルをそのディレクトリに接続する論理パスはすべて同じように動作します。

pwd -Pの出力をの出力と比較(または直接AND演算)して、pwd -L物理パスと論理パスの違いを検出できます$PWD。基本的な警告を書きましょうls:

function ls (
   p="$(pwd -P)"
   command ls "$@"
   [ "$p" != "$PWD" ] && >&2 printf 'ls: warning: ./ -> %s/\n' "$p"
)

エイリアスの代わりに関数を使用しました。なぜなら、alias ls='ls --color=auto'それは一般的で、それを壊したくないからです。これにはエイリアスは適用されません。。エイリアスが存在する可能性が高いため、構文は移植可能なものfunction ls …よりも優れていますls () …(後者はエイリアスをトリガーします)。

この基本機能は完璧ではありません。ls /some/other/dirNever warnings /some/other/dir、警告します./(シンボリックリンクされている場合)。しかし、./この場合は重要ではありません。

とにかく、「私が持っているサブディレクトリがシンボリックリンクディレクトリの(孫...)サブディレクトリかどうかはどうすればわかりますか?」への答えは次のとおりです。例:

[ "$(pwd -P)" != "$PWD" ]

おすすめ記事