$> ls ../../../../..
と同じ結果は得られません
$> cd ../../../../..
$> ls
どうして?リンク付きの何か?どうしたの?
[ johanrj@jamin ] ~/XXX/broadcom/asuswrt/release/src-rt-6.x/linux/linux-2.6/drivers/net/phy/WRT/openwrt-git-8.09.2/package/swconfig/src
$> ls ../../../../..
9145-D5B0 asuswrt BCM53125 bcm_switch jrj Packages workspace
[ johanrj@jamin ] ~/XXX/broadcom/asuswrt/release/src-rt-6.x/linux/linux-2.6/drivers/net/phy/WRT/openwrt-git-8.09.2/package/swconfig/src
$> cd ../../../../..
[ johanrj@jamin ] ~/XXX/broadcom/asuswrt/release/src-rt-6.x/linux/linux-2.6/drivers/net/phy
$> ls
adm6996.c cicada.c libphy.ko lxt.c mdio-boardinfo.h mdio_bus.o phy_device.c smsc.c swconfig.mod.c WRT
adm6996.h davicom.c libphy.mod.c Makefile mdio_bus.c Module.symvers phy_device.o swconfig.c swconfig.mod.o
b53 fixed.c libphy.mod.o marvell.c mdio_bus.c.orig phy.c phy.o swconfig.ko swconfig.o
broadcom.c Kconfig libphy.o mdio-boardinfo.c mdio_bus.c.rej phy.c.orig qsemi.c swconfig_leds.c vitesse.c
はい、シェルはシンボリックリンクディレクトリへの変更を賢くしようとします。
$ mkdir a
$ ln -s a b
$ cd b
$ pwd
/home/michas/b
$ pwd -P
/home/michas/a
シンボリックリンクb
に変更した後、シェルは実際に「ディレクトリ」b
にいるふりをしますが、代わりにシンボリックリンクがディレクトリa
に移動します。
help pwd
を参照してください:
-P print the physical directory, without any symbolic links
外部コマンド(ls
など)は常に物理パスを使用しますが、シェルビルトインはデフォルトで仮想シンボリックリンクパスを使用します。
cd
コマンドはシェルに組み込まれており、デフォルトではcd ..
を「物理的な親を使用する」ではなく「現在のシンボリックリンクを残す」と解釈します。ただし、その動作は変更できます。 help cd
のコメント:
-P use the physical directory structure without following symbolic
links: resolve symbolic links in DIR before processing instances
realpath
を使用して解決されたリンクを使用して実際のパスを取得し、出力を比較できます
realpath ../../../../..
cd ../../../../..
realpath .
私のシステムでは:
~/shared $ realpath ..
/home/avdndata/lnk
~/shared $ cd ..
~ $ realpath .
/home/anthon