Bagikan alias dan pengaturan PATH antara zsh dan bash

24

Shell yang biasa saya gunakan adalah zsh. Saya memiliki beberapa alias untuk mengaktifkan warna di beberapa program seperti lsdan grep. Saya juga telah menetapkan jalur khusus saya sehingga saya dapat menjalankan program di tempat yang tidak standar (seperti di ~/bin/).

Aku tidak akan mengubah shell root untuk zsh, tapi saya ingin berbagi pengaturan ini sehingga akar dapat memilikinya juga. Saya menemukan bahwa zshitu bukan sumber /etc/profile. Saya dapat sumbernya /etc/zsh/zprofile, tapi saya ingin cara lain yang lebih "tepat".

phhehehe
sumber

Jawaban:

16

Saya akan membuat file /etc/commonprofiledan sumbernya di kedua /etc/profiledan /etc/zsh/zprofile. Ini memberi Anda kesempatan untuk berbagi pengaturan umum dan bashmasing zsh- masing masih menggunakan pengaturan khusus dan sintaksis /etc/profilemasing-masing zprofile.

fschmitt
sumber
di antara jawaban-jawaban bagus lainnya, saya pikir yang ini cocok untuk saya yang terbaik, relatif sederhana, dan "bersih"
phunehehe
apa yang Anda maksud dengan "sumber itu"?
Hlung
@ Hang Untuk memuat explicility profil shell, di sini 'source /path/to/.shell_profile' datang. Lihat halaman manual di 'sumber'.
Itachi
17

Zsh memiliki mode kompatibilitas sh yang memungkinkannya menjalankan kode sh POSIX dan beberapa ekstensi bash. Selama Anda tidak menggunakan fitur bash yang tidak dimiliki zsh (dengan sintaks yang sama), Anda dapat memiliki file yang sama yang bersumber dari kedua shell. Gunakan emulatebawaan untuk menempatkan zsh dalam mode kompatibilitas; dengan -Lopsi, emulasi bersifat lokal untuk fungsi penutup (bukan skrip sumber terlampir).

source_sh () {
  emulate -LR sh
  . "$@"
}

Untuk hal-hal seperti variabel lingkungan, Anda dapat menggunakan source_sh /etc/profiledalam /etc/zprofiledan source_sh ~/.profiledalam ~/.zprofile, karena file profil tidak cenderung menggunakan fitur spesifik bash.

Untuk hal-hal seperti alias dan definisi fungsi, karena file shell rc cenderung mengandung banyak hal yang tidak dapat dibagi (prompt, binding kunci, pengaturan selesai, ...), menggunakan file seperti ~/.sh_aliasesyang bersumber di ~/.bashrcdan source_sh'd di ~/.zshrc.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Seharusnya ada cara untuk mengatakan "secara otomatis menghapus semua jawaban oleh Gilles". Ini akan menghemat waktu saya. Tidak juga, jawaban Anda mengguncang. Selalu akurat, ditulis dengan baik dan komprehensif.
fschmitt
@ fschmitt: Saya setuju. Dan Anda dapat melihatnya bahkan tidak diedit! Petunjuk yang disediakan di sini benar-benar bagus.
Seseorang masih menggunakan Anda MS-DOS
4

Bagaimana dengan symlink sederhana?

ln -s /etc/profile /etc/zsh/zprofile

Anda juga dapat menambahkan sesuatu seperti ini jika Anda memerlukan inisialisasi bersyarat:

#Determine our shell without using $SHELL, which may lie
shell="sh"
if test -f /proc/mounts; then
   case $(/bin/ls -l /proc/$$/exe) in
        *bash) shell=bash ;;
        *dash) shell=dash ;;
        *ash)  shell=ash ;;
        *ksh)  shell=ksh ;;
        *zsh)  shell=zsh ;;
    esac
fi
echox
sumber
Hmm tapi saya rasa ini tidak akan lebih bersih dari sumbernya. Apakah ada file yang dibaca zsh dan bash?
phunehehe
apa yang membuat Anda berpikir bahwa mencari atau membuat symlink bukanlah solusi "bersih"?
echox
Saya hanya bermaksud mengatakan jika perlu, saya ingin sumber file daripada mengelola symlink. Saya tidak ingin membuat banyak ketergantungan antar file.
phunehehe
1
Alternatif yang lebih portabel /bin/ls -l /proc/$$/exeadalah ps -o comm= -p $$. Ini tidak sepenuhnya dapat diandalkan karena beberapa shell berperilaku berbeda tergantung pada bagaimana mereka dipanggil; dalam praktek hanya menguji $0di .profilekemungkinan menjadi indikasi yang lebih baik. Tapi kebanyakan kerang yang menawarkan fitur yang bermanfaat (bash, ksh, zsh) dapat hanya diakui (dan versi mereka diidentifikasi, yang ditambah besar) dengan menguji beberapa variabel: $BASH, $BASH_VERSION, $BASH_VERSINFO; $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
Gilles 'SO- stop being evil'
echox, pernyataan kasus Anda tidak benar mendeteksi zsh4 # Tetapkan shell kita tanpa menggunakan $ SHELL, yang mungkin terletak shell = "sh" jika test -f / proc / mounts; maka case $ (/ bin / ls -l / proc / $$ / exe) di bash) shell = bash ;; * dash) shell = dash ;; * ash) shell = ash ;; * ksh) shell = ksh ;; * zsh ) shell = zsh ;; #matches zsh4 esac fi
Bryan Hunt
0

Mengenai variabel, saya memiliki kesan bahwa Anda kehilangan modul & modulefiles [1]. Setelah Anda mulai melakukannya, akan mudah untuk membuat profil umum untuk berbagai shell (termasuk bash & zsh), python, perl dan bahkan lebih banyak lingkungan, semua dari kenyamanan satu file modul.

Dimungkinkan juga untuk mendefinisikan alias dengan cara yang sama; namun, Anda akan dengan cepat menemukan bahwa alias tidak diwarisi dengan baik di antara cangkang yang berurutan dan mungkin perlu diperbaiki.

[1] http://en.wikipedia.org/wiki/Environment_Modules_(software)

fgeorgatos
sumber