Menyelesaikan tautan simbolik (pwd)

32

Katakan saya melakukan yang berikut:

cd /some/path
ln -s /target/path symbolic_name

Jika kemudian lakukan:

cd /some/path
cd symbolic_name
pwd

Saya mendapat:

/some/path/symblic_name

dan tidak:

/target/path

Apakah ada cara untuk membuat shell "sepenuhnya menyelesaikan" tautan simbolik (yaitu memperbarui CWD, dll.), Seolah-olah saya telah melakukan secara langsung:

cd /target/path

?

Saya perlu menjalankan beberapa program yang tampaknya "sadar" atau "sensitif" tentang bagaimana saya sampai ke jalur target saya, dan saya ingin mereka berpikir bahwa saya tiba di jalur target seolah-olah telah dilakukan cd /target/pathsecara langsung.

Amelio Vazquez-Reina
sumber
7
Terkait dengan pertanyaan ini . Anda dapat melakukan pwd -Patau alias pwd='pwd -P'juga cd -Ppergi ke jalur fisik alih-alih symlink.
Martín Canaval
@ MartínCanaval Terima kasih; itulah yang saya cari!
Ryan

Jawaban:

35

Shell Anda memiliki builtin pwd, yang mencoba menjadi "pintar". Setelah Anda melakukan cdsymlink, internal pwdmemalsukan output seolah-olah Anda pindah ke direktori nyata.

Lewati -Popsi pwd, yaitu jalankan pwd -P. The -Ppilihan (untuk “fisik”) mengatakan pwduntuk tidak melakukan pelacakan link simbolik dan menampilkan “nyata” path ke direktori.

Atau, harus ada biner nyata pwd, yang tidak melakukan (dan bahkan tidak dapat melakukan) sihir semacam ini. Cukup gunakan kejelasan biner itu:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
$ mkdir a
$ ln -s a b
$ cd b
$ pwd
/home/michas/b
$ /bin/pwd
/home/michas/a
michas
sumber
12

Coba cd -P <symlink_dirname>.

tim@ls:~$ mkdir a
tim@ls:~$ ln -s a b

tim@ls:~$ cd b
tim@ls:~/b$ pwd
/home/tim/b

tim@ls:~/b$ cd ..
tim@ls:~$ cd -P b
tim@ls:~/a$ pwd
/home/tim/a

Anda juga dapat menggunakan set -o physicaluntuk membuat perilaku ini bertahan selama masa pakai shell yang sedang berjalan.

Lihat https://stackoverflow.com/questions/10456784/behavior-of-cd-bash-on-symbolic-links untuk info lebih lanjut.

livingstaccato
sumber