Jadi saya tahu bahwa pwd
dan cd
di shell memiliki mode "logis" dan "fisik" (lihat pertanyaan SO ini dan pertanyaan yang ditautkan dari sana).
Sekarang, anggap saya memiliki symlink ini:
/home/<username>/foo -> /tmp/bar
Untuk mengikuti secara lokal, lakukan saja ini:
mkdir /tmp/bar
ln -s /tmp/bar ~/foo
Sekarang, ketika saya mulai di $HOME
. saya dan cd
ke dalam foo
, saya mendapatkan jalur "logis" (dengan pengaturan default) dengan pwd
, dan bisa mendapatkan jalur "fisik" dengan -P
:
$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar
Tentu saja, “..
” selalu mengacu pada induk dari jalur “fisik” (pemahaman saya adalah bahwa itu bahkan tidak ditafsirkan oleh shell, hanya diteruskan ke perintah apa adanya, dan beberapa perintah bawaan khusus seperti cd
menafsirkannya secara khusus untuk mendapatkan perilaku "logis"):
$ pwd
/home/<username>/foo
$ realpath ..
/tmp
Yang saya inginkan adalah ketika saya berada di $HOME/foo
(atau subdirektori mana pun) yang saya gunakan untuk semua jalur relatif (mis. ls -l ../..
) untuk ditafsirkan/diperluas relatif terhadap jalur "logis" (tidak masalah jika saya harus mengawali perintah saya dengan sesuatu).
Misalnya:
$ pwd
/home/<username>/foo
$ vi ../something.txt
Saya ingin ini diselesaikan ke vi /home/<username>/something.txt
.
Apakah ada sesuatu yang lebih mudah/lebih pendek daripada melakukan hal berikut (atau menulis fungsi shell yang dapat saya awali dengan perintah saya yang mencakup semua argumen dan – jika merujuk ke jalur – perluas sebelum meneruskannya ke perintah)?
$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)
Apakah ada sesuatu seperti "ekspansi jalur logis untuk parameter baris perintah yang merupakan jalur file relatif yang dilakukan sebelum shell menjalankan perintah"? Saya menggunakan zsh
, tetapi solusi apa pun untuk bash
atau zsh
akan baik-baik saja.
Jawaban yang Diterima:
Saya akan menjawab ini untuk Zsh, karena itulah yang saya gunakan.
Untuk mendapatkan efek yang Anda inginkan dengan ..
saat menggunakan cd
, cukup tambahkan berikut ini ke ~/.zshrc
. Anda berkas:
setopt NO_chase_dots NO_chase_links
Dokumentasi di sini:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS
Untuk semua kasus lain, alih-alih ..
, Anda harus menggunakan :h
Pengubah ekspansi (“kepala”):
$ pwd
/home/<username>/foo
$ vi $PWD:h/something.txt
Jika Anda perlu mencapai lebih dari satu level, Anda dapat menambahkan angka padanya (asalkan Anda mengapit ekspresi dengan kurung kurawal) atau cukup ulangi :h
:
# These two are equivalent:
$ vi ${PWD:h2}/foo
$ vi $PWD:h:h/foo
Dokumentasi di sini:http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers