web-dev-qa-db-ja.com

lsは同じフォルダにcd + lsと同じものを与えません

$> 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
2
JohnyTex

はい、シェルはシンボリックリンクディレクトリへの変更を賢くしようとします。

$ 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
3
michas

realpathを使用して解決されたリンクを使用して実際のパスを取得し、出力を比較できます

realpath ../../../../..
cd ../../../../..
realpath .

私のシステムでは:

~/shared $ realpath ..
/home/avdndata/lnk
~/shared $ cd ..
~ $ realpath .
/home/anthon
1
Anthon