私がシンボリックリンクされた(ソフト)フォルダのサブフォルダ(または孫など)であるコンソールのサブフォルダにあるとしましょう。
サブフォルダでls -la
何もしないと、すべてのファイルがSymlinkフォルダ内にあることが表示されます。
私はどのように知っていますか?現在これを確認するには、親フォルダに移動する必要があります。
ただし、これはエラールックアップをテストして、親(リンク)に達するまですべてのフォルダ階層をテストすることを意味します。
ベストアンサー1
一部のシンボリックリンクを介して現在の作業ディレクトリに移動したという事実は、シェル(Bashなど)でのみ追跡されます。ここに移動したパスは論理パスと呼ばれ、実際にはディレクトリへのシンボリックリンクであるディレクトリコンポーネントを含めることができます。すべてのシンボリックリンクが解決された後のパスは物理パスと呼ばれます。
現在のBashまたは組み込みツールではなく、シェルの現在の作業ディレクトリから別々のプロセスとして作成された場合、物理パスは運用ディレクトリであるため、そのディレクトリへの物理パスを自然に知ることができます。プロセスに関連するシステムパス(/proc/self/cwd
プロセスの場合)。ツールは、PWD
その環境で変数を調べるか、変数を調べるツールを使用して論理パスを調べることができます。変数の値は Bash から取得されます。
cd
Bashでは、組み込み関数はpwd
物理パスまたは論理パスで動作できます。この回答。pwd
これは組み込みではなく(たとえば)、その環境の変数を/usr/bin/pwd
確認するため、論理パスのみを通知できます。PWD
Symlink ディレクトリで以下を比較します。
$ 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
。
ls
PWD
環境には興味がありません。物理パスと論理パスの間に発生する可能性のある違いは、実行される操作とは何の関係もありません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/dir
Never warnings /some/other/dir
、警告します./
(シンボリックリンクされている場合)。しかし、./
この場合は重要ではありません。
とにかく、「私が持っているサブディレクトリがシンボリックリンクディレクトリの(孫...)サブディレクトリかどうかはどうすればわかりますか?」への答えは次のとおりです。例:
[ "$(pwd -P)" != "$PWD" ]