Setara dengan alias untuk tautan simbolis?

18

Saya menemukan diri saya perlu melompati beberapa direktori di folder rumah saya sering dan bosan menulisnya. Saya ingin pendekatan yang lebih cepat, yang secara tradisional akan menjadi tautan simbolik.

Namun, saya tidak ingin mengacaukan direktori rumah saya dengan lusinan tautan simbolik. Aku bisa membuat beberapa ~/links/direktori dan kekacauan itu dengan link simbolik, tapi masih jelek. Selain itu, saya mungkin ingin membuat tautan simbolis yang berubah setiap hari (didefinisikan dalam .bashrc) untuk melompat ke direktori hari ini.

Apakah ada cara untuk secara efektif alias tautan simbolik, membuat sesuatu yang akan dikenali sebagai tautan untuk navigasi cepat, tetapi tidak akan benar-benar muncul ketika saya melakukan lsdirektori rumah saya, dan tidak akan bertahan melampaui sesi saat ini?

dsollen
sumber
4
Anda mungkin ingin melihat ke pushd dan popd
Rui F Ribeiro
saya menemukan pendekatan Jeroen Janssen yang mudah beradaptasi dan murah untuk kebutuhan yang tepat ini: jeroenjanssens.com/2013/08/16/…
Theophrastus
2
Shell apa yang Anda gunakan?
Gilles 'SO- stop being evil'
@Theophrastus Heh - pada dasarnya apa yang saya implementasikan ulang tidak cukup elegan dalam jawaban saya.
mattdm
3
tidak persis apa yang Anda cari, tetapi mungkin masih berguna ketika melompat bolak-balik antara dua directoris: cd -akan cdke direktori terakhir sebelumnya. Oleh karena itu, jika Anda melakukannya dua kali, Anda akan kembali ke tempat Anda memulai ... sangat bagus untuk situasi "oh saya lupa mengedit someFile.txt di lokasi sebelumnya" => Cukup cd -:, edit someFile.txtcd -
dingalapadum

Jawaban:

12

Anda dapat menggunakan penyelesaian tab. Secara default pada banyak distribusi Linux, bash sudah diatur sehingga ketika Anda menekan tombol [TAB], Anda diberikan daftar kemungkinan kecocokan, atau jika hanya ada satu kecocokan, semuanya diisi. Untuk cd, ini biasanya daftar subdirektori dari direktori kerja saat ini. Anda bisa menimpanya, tapi saya sarankan daripada membuat alias, seperti jduntuk "direktori melompat":

alias jd=cd

dan kemudian, mendefinisikan "bookmark" yang Anda inginkan sebagai pelengkap untuk jd. Lihatlah halaman bash man untuk lebih banyak opsi (termasuk menghasilkan secara otomatis hasil langsung dari perintah atau fungsi), tetapi cara termudah hanyalah daftar kata, dengan -W:

lengkap -W "/ srv / www ~ / tmp ~ / work" jd

Sekarang, ketik jddan tekan [TAB], dan Anda akan melihat "bookmark" Anda. Ketik setiap bagian yang ambigu, dan kemudian tekan [TAB] untuk menyelesaikan. (Di atas, ~s meluas ke direktori home saya, jadi [TAB] pertama memberi saya /, dan jika saya menekan wdan [TAB] lagi, /srv/wwwdiisi.)

Tentu saja, masukkan ini ~/.bash_profileuntuk membuatnya bertahan.

Atau, kita bisa membawa ini ke level selanjutnya. Buat direktori ~/.shortcuts- dimulai dengan titik, itu akan disembunyikan dan tidak direproduksi direktori home bersih Anda - dan mengisinya dengan symlink ke direktori yang Anda inginkan. Kemudian, letakkan ini di ~ / .bash_profile Anda:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

Ini mendefinisikan penyelesaian yang sedikit lebih rumit dalam fungsinya _list_shortcutsuntuk membangun daftar nama, dan menjadikannya jdfungsi daripada alias sederhana, karena kita ingin itu bertindak berbeda dari adil cd. The -Pbendera untuk cdmerek itu menyelesaikan symlink, sehingga semuanya menjadi sihir transparan. Nama pintasan Anda bahkan tidak harus sesuai dengan target.

Begitu:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

Dan, untuk dosis mewah, buat jddaftar semua pintasan Anda saat dijalankan tanpa parameter apa pun:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

Catatan: Saya menggunakan compgen -W $( cmd )bukan compgen -C 'cmd'karena yang terakhir tidak pernah bekerja untuk saya dan saya tidak mengerti mengapa. Itu mungkin pertanyaan baru saya sendiri. :)

mattdm
sumber
sangat menarik. Satu tangkapan, masih perlu mengetikkan tautan lengkap, atau setidaknya cukup tautan untuk menjadi non-ambigu, sebelum saya bisa menyelesaikannya dengan jd. Adakah cara untuk menambahkan alias ke perintah jd untuk mempersingkatnya? atau membuatnya relatif ke direktori di mana saya bisa menyimpan tautan simbolis saya kira.
dsollen
@dsollen Lihat pembaruan :)
mattdm
ini bekerja dengan sempurna. Dalam semua kejujuran saya tidak mengharapkan jawaban yang baik untuk pertanyaan ini, tetapi ini adalah persis apa yang saya inginkan. Saya mengantisipasi sedikit penggunaan ini dan rasanya cukup bersih untuk menambah daftar hal-hal yang saya modifikasi setiap kali saya mendapatkan VM baru (saya bahkan memiliki cara otomatis untuk mengkloning perubahan lingkungan standar saya ke vm lol baru). Terima kasih banyak. Pada titik ketika saya memiliki lebih banyak waktu luang, saya akan mencari tahu bagaimana sintaks untuk COMPREPLY bekerja;)
dsollen
18

Alias ​​Shell memiliki fitur yang dapat Anda lakukan (beberapa) nama-penyelesaiannya (biasanya terikat tab). Atau, Anda dapat menggunakan CDPATHfitur, yang "baru-baru ini" (dalam 5-6 tahun terakhir) telah ditingkatkan untuk mendukung penyelesaian nama. Jika itu berhasil untuk Anda, itu memiliki keuntungan bahwa apa yang Anda ketik adalah nama sebenarnya dari direktori daripada mnemonik untuk itu.

Menurut manual bash

CDPATH
Daftar direktori yang dipisahkan oleh titik dua yang digunakan sebagai jalur pencarian untuk cdperintah builtin.

Bacaan lebih lanjut:

Thomas Dickey
sumber
Tidak tahu tentang CDPATHvariabel lingkungan, terima kasih. Saya mungkin menambahkan git_reposdirektori saya ke variabel itu ....
Wildcard
16

Untuk direktori yang sering Anda kunjungi, tetapi jangan berubah setiap hari, opsi lain hanya memiliki beberapa aliasperintah di .bashrcfile Anda :

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

Seorang teman memiliki sekitar 50 di antaranya; Saya punya beberapa; cepat dan mudah. Hanya

cdo

untuk mengubah direktori ke / u01 / app / oracle

Mark Stewart
sumber
Memang. Saya telah menggunakan mekanisme ini sejak awal 1990-an.
wallyk
7

Saya merekomendasikan pushddan popd.

Saya pribadi menemukan mereka berguna ketika melakukan pekerjaan pengembangan / membaca kode sumber, ketika beberapa direktori terlibat.

Mereka secara efektif menerapkan struktur stack / LIFO, di mana Anda PUSH direktori ( pushd), dan perintah direktori POP berikutnya ( popd) mengambilnya.

Jadi, ketika di dalam dir, Anda akan melakukan:

pushd .

Dan ketika Anda perlu mengambilnya, Anda lakukan

popd

Anda dapat melakukan banyak pushd, dan melakukan yang sesuai popdnanti, untuk kembali ke direktori.

Saya akan meninggalkan di sini tautan.

http://www.eriwen.com/bash/pushd-and-popd/

Rui F Ribeiro
sumber
1
Ini adalah solusi yang saya gunakan juga, dengan pengecualian bahwa saya tidak popdbanyak menggunakan . Saya mengisi dirsdaftar saya (yang diisi oleh pushdperintah) dengan semua direktori yang ingin saya kunjungi / kerjakan untuk itu, kemudian saya jalankan pushd +1. Lalu, saya bisa menelusuri direktori dengan sederhana !puyang sangat cepat. (Perhatikan bahwa pada Ubuntu dan CentOS, pushdadalah satu - satunya perintah yang tersedia pada instalasi bersih yang dimulai dengan pu.)
Wildcard
3

Anda bisa menempatkan mereka sebagai variabel di Anda ~/.bashrc, dan kemudian mereka hanya $pergi.

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj
Ewan Mellor
sumber
3

Jawaban yang jelas adalah variabel , hal-hal simbolis dalam shell yang mewakili hal-hal lain, mirip dengan tautan simbolis dalam sistem file.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

Dalam shell yang layak, Anda mendapatkan Tabpenyelesaian pada nama variabel yang selanjutnya membantu.

Kaz
sumber