私のホームディレクトリから/home/regis
そのディレクトリへのシンボリックリンクを作成し、タスクを実行した後、bashとそのオートコンプリートとの間で競合が発生し、競合が発生しました。LINK
DIR/SUBDIR
cd LINK
..
bashオートコンプリートの場合、PS1を使用したときに表示されるプロンプトと同様にパスワードが表示されるため、ユーザーが期待どおりに..
この結果が発生します。/home/regis
/home/regis/LINK
\w
Bash自体の場合、..
causeDIR
と../..
causeは、示されているように/home/regis
実際のパスを使用していることを意味します。/home/regis/DIR/SUBDIR
pwd -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チャートの場合。