bashとオートコンプリート機能が..ディレクトリシンボリックリンクの意味で競合しています。

bashとオートコンプリート機能が..ディレクトリシンボリックリンクの意味で競合しています。

私のホームディレクトリから/home/regisそのディレクトリへのシンボリックリンクを作成し、タスクを実行した後、bashとそのオートコンプリートとの間で競合が発生し、競合が発生しました。LINKDIR/SUBDIRcd LINK..

bashオートコンプリートの場合、PS1を使用したときに表示されるプロンプトと同様にパスワードが表示されるため、ユーザーが期待どおりに..この結果が発生します。/home/regis/home/regis/LINK\w

Bash自体の場合、..causeDIR../..causeは、示されているように/home/regis実際のパスを使用していることを意味します。/home/regis/DIR/SUBDIRpwd -P

ここではどのような動作が予想されるべきですか?私がここで何か間違っているのでしょうか?

/home/regis$ タッチファイル
/home/regis$ mkdir -p DIR/SUBDIR
/home/regis$ ln -s ディレクトリ/サブディレクトリリンク
/home/regis$ CDリンク

/home/regis/LINK$ ls ../FI # ここでは、TAB を使用したオートコンプリートが成功します。
/home/regis/LINK$ ls ../FILE # しかし、ここではオートコンプリートコマンドは失敗します。
ls: '../FILE' にアクセスできません: そのファイルまたはディレクトリがありません
/home/regis/LINK$ ls ../../FILE # コマンドの成功
文書

$bash -バージョン
GNU bash、バージョン 5.0.17(1)-リリース(x86_64-pc-linux-gnu)

ベストアンサー1

Bash自体の..原因DIR../..原因/home/regis

普通ではない…

/home/regis/LINK$ ls ../FILE # but autocompleted command will fail here
ls: cannot access '../FILE': No such file or directory
/home/regis/LINK$ ls ../../FILE # command succeeds

...しかし、これはBashではありません。これはls

問題は、ユーザーフレンドリーにしようとしているBashがcdシンボリックリンクを通過したときにその場所に到達するために選択したパスを内部的に覚えていることです。その後、たとえば、cd ..Bashでそのパスを使用すると、開始したcd LINK; cd ..場所に戻ることができます。

しかし、これはls外部プロセスなので、これについて何も知らず、どのコマンドを使用してそこに到達しても、ここにあるいくつかの/home/regis/DIR/SUBDIR作業ディレクトリでのみ実行されているようです。cdまあ、実際にはパス名をオペレーティングシステムに渡し、オペレーティングシステムは気にせず、ファイルシステムのエントリlsと一緒に作業ディレクトリをそのまま使用します。..

代わりに、シェルはこの特別な動作を無効にし、シェルと同じパスを見るcd -P LINKことができます。/home/regis/DIR/SUBDIR一般に、人々は、シンボリックリンクが指すポイントを過ぎて「上に」移動しようとしない限り、ほとんどの場合うまく動作するので、気にしません。

私の以前の答えも参照してください。 https://unix.stackexchange.com/a/739426/170373同じトピックの「きれいな」ASCIIチャートの場合。

おすすめ記事