xterm は、ディレクトリを移動してもディレクトリを切り替えません。

xterm は、ディレクトリを移動してもディレクトリを切り替えません。

最近、私はxtermが期待どおりに動作しなかったので、非常に不満を感じました。これが私がすることです:

  1. xtermを開く
  2. 次のコマンドを実行します。

    $ mkdir test_01
    $ cd test_01/
    $ echo 'a' > a
    $ cat a
    

    出力は次のとおりです。

    a
    
  3. 別のxtermを開きます(最初のxtermを閉じないでください)。

  4. 次のコマンドを実行します。

    $ mv test_01/ test_01_old
    $ mkdir test_01
    $ cd test_01
    $ echo 'b' > a
    $ cat a
    

    出力は次のとおりです。

    b
    
  5. 次に、元のxtermでコマンドを実行します。

    $ cat a
    

    出力は次のとおりです。

    a
    

なぜこれが起こるのですか?このステップでは、両方のxtermコマンドは同じディレクトリpwd(たとえば/home/user_1/test_01

ベストアンサー1

これはxtermとは何の関係もありません。 xtermを呼び出さなくても、両方のシェルを使用して同じことを実行できます。この問題については、シェルを使用してこれを行うことができます(以下を参照)。

すべてのプロセスには現在の作業ディレクトリがあります。これは名前で追跡されず、ディレクトリ自体への(やや)ポインタで追跡されます。 (内部的にどのように表現されるかはよくわかりません。おそらくディレクトリのメジャー番号とマイナー番号、inode番号に似ています。)

最初のxtermで実行されているシェルの現在のディレクトリはtest_01次のとおりです。その後、ディレクトリの名前は(他のプロセスによって)test_01-から変更されましたが、test_01_oldまだ同じディレクトリであり、シェルプロセスはまだこのディレクトリを現在のディレクトリとして使用します。

カーネルは現在のディレクトリの名前を覚えていませんが、シェルは覚えています。組み込みコマンドを実行するときにpwdこの情報を使用してください。最初のxtermの下のシェルはディレクトリ名が変更されたことを認識しないため、pwd入力するとキャッシュされたパスが印刷されます。

ただし、/bin/pwdこれは外部コマンドなので、シェルのキャッシュされた情報にアクセスすることはできません。現在のディレクトリ(名前はすぐには不明)から始まり、そのエントリを調べてからルートディレクトリ..(つまり、エントリが自分を指すディレクトリ..)に達するまでディレクトリ階層をナビゲートするように動作します。次に、文字で区切られたパス要素を逆順に印刷します/

たとえば、私のシステム(Ubuntu 12.04、bash 4.2.24)では、次のことが行われました。

$ pwd ; /bin/pwd
/home/kst
/home/kst
$ mkdir test_01
$ cd test_01
$ pwd ; /bin/pwd
/home/kst/test_01
/home/kst/test_01
$ mv /home/kst/test_01 /home/kst/test_01_old
$ pwd ; /bin/pwd
/home/kst/test_01
/home/kst/test_01_old
$ cd $(/bin/pwd)
$ pwd ; /bin/pwd
/home/kst/test_01_old
/home/kst/test_01_old
$ 

ご覧のとおり、一貫pwd/bin/pwdがあります。~まで現在のディレクトリの名前を変更すると、シェルの組み込み機能がpwd記憶する現在のディレクトリを印刷します。しかし、私がそうしたときcd $(/bin/pwd)、2人は再同期しました。

おすすめ記事