Mengubah shell default tanpa chsh atau hak administrator

8

Saya melihat cuplikan berikut di utas ini: Cara mengubah dari csh ke bash sebagai shell default

sleep 2
if (-x /usr/local/bin/bash) then
  exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash'
endif

Pemahaman saya adalah bahwa jika Anda menempatkan potongan ini di ~/.logindalamnya akan meminta bashketika Anda masuk.

Saya memiliki situasi yang serupa di mana saya ingin menggunakan cuplikan serupa untuk meminta versi zshyang berbeda dari yang standar dengan mana saya masuk. Salah satu alasan mengapa saya mengalami masalah ini adalah karena saya tidak dapat memilih versi yang saya inginkan zshdalam opsi diizinkan masuk chsh, dan saya tidak memiliki hak administrator.

Dengan ini:

  • Bagaimana saya mengubah cuplikan di atas untuk melakukan ini ketika beralih di antara berbagai versi zsh?
  • Mengapa dua execperintah diperlukan dalam cuplikan di atas? Apa yang mereka lakukan? Juga, mengapa cuplikan di atas menggunakan sh dan bash (pengguna seharusnya masuk dengan csh)
Amelio Vazquez-Reina
sumber

Jawaban:

6

Jika Anda ingin mengeksekusi zsh bukan bash, cukup ganti /usr/local/bin/bashdengan path ke zshexecutable. Perhatikan bahwa cuplikan ini khusus untuk csh; jika shell login Anda bukan (t) csh, kode ~/.loginini tidak akan melakukan apa pun untuk Anda.

Mengenai mengapa cuplikan ditulis seperti itu, Anda harus bertanya kepada orang yang menulisnya. [Memeriksa siapa itu.] Oh. Nah, jika Anda baru saja melakukannya, exec /usr/local/bin/bashAnda tidak akan memulai shell login, jadi Anda .profiletidak akan dieksekusi. Tapi ini bisa diselesaikan dengan cara yang lebih sederhana dengan mengeksekusi /usr/local/bin/bash --login.

Sekarang, jika shell login Anda bukan csh, Anda perlu potongan yang berbeda di sekitar exec. Dalam cangkang Bourne-style, termasuk zsh:

if [ -x ~/bin/zsh ]; then exec ~/bin/zsh; fi

Buat itu exec ~/bin/zsh -ljika Anda ingin instance baru zsh untuk membaca ~/.zprofile. Perhatikan bahwa jika Anda melakukannya, cuplikan di atas harus ada di Anda .profileatau .bash_profile; jika shell login Anda adalah zsh, jangan masukkan snippet Anda .zprofile, atau pastikan bahwa instance baru zsh tidak akan memanggilnya execlagi.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih @Gilles. Saya menulis yang berikut pada saya .zprofile: if [[ $ZSH_VERSION != 4.3.14 ]]; then exec /n/sw/zsh-4.3.14/bin/zsh --login fidan itu tampaknya berhasil!
Amelio Vazquez-Reina