Unixビルトイン「PWD」コマンドと$ PWD環境変数の違いは何ですか?
質問
これが事実です。ディレクトリコールがあります: - %/home/myname/
私はそのディレクトリでソフトリンクを実行しました: - %cd/home/myname/%ln -s/home/others/。
さて、私は他の人に/ from/ home/ myname/これが興味深い部分です。
Unix組み込みをしたとき pwd
コマンド、元のパス名を取得します: - %/home/others/
しかし、$ PWD環境変数をエコーすると、リンクパス名が表示されます。
どうしてこんなことに?
解決
/var# ls -l lrwxrwxrwx 1 root root 10 Aug 22 13:21 mail -> spool/mail drwxr-xr-x 2 root root 4096 Jul 1 20:58 opt drwxr-xr-x 22 root root 4096 Dec 5 17:38 run drwxr-xr-x 12 root root 4096 Aug 22 13:21 spool drwxrwxrwt 14 root root 4096 Dec 6 02:46 tmp /var# cd mail /var/mail# echo $PWD /var/mail /var/mail# pwd /var/mail /var/mail# /bin/pwd /var/spool/mail
言い換えれば、使用します $PWD
なぜなら、なぜなら、なぜなら pwd
とにかく(より良い定義のために)より良い結果を与えないかもしれません。
なぜそれが? /bin/pwd
OS固有の呼び出しを使用して現在の作業ディレクトリを決定します - およびLinuxの場合、カーネルは解決済みディレクトリのみを保持します(参照 /proc/self/cwd
)、シェルのPWDには、シェルが考えているものが含まれています。
他のヒント
の違い /bin/pwd
外部コマンドと組み込みは、外部コマンドがどのセットのセットを知らないことです cd
操作はあなたをそこに届けたので、あなたの現在のディレクトリがSymlinksのチェーンのどこかにあるふりをしません。ルートから現在のディレクトリへの直接的なパスを提供します。 realpath()
機能はそうします。
見る set -o physical
の bash
.
所属していません StackOverflow