GNU/Linux >> Belajar Linux >  >> Linux

Zsh/bash:Perluas Jalur Relatif Dalam Argumen Perintah Menggunakan Aturan Struktur Direktori Logis Sebelum Eksekusi?

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


Linux
  1. Pisahkan keluaran perintah dengan kolom menggunakan Bash?

  2. Pertahankan Kutipan dalam argumen bash

  3. Tetapkan waktu relatif menggunakan baris perintah

  1. Mengapa Mengatur Variabel Sebelum Perintah Legal Di Bash?

  2. Menggunakan –exclude Dengan Perintah Du?

  3. chroot gagal - tidak dapat menjalankan perintah `/ bin/bash':Tidak ada file atau direktori tersebut

  1. Lewati Argumen Baris Perintah ke Skrip Bash?

  2. Menggunakan Perintah Tidur Linux di Skrip Bash

  3. Menggunakan Perintah Nama Dasar Linux di Skrip Bash