Modifica della shell predefinita senza chsh o privilegi di amministratore


8

Ho visto il seguente frammento in questo thread: Come passare da csh a bash come shell predefinita

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

La mia comprensione è che se si inserisce questo frammento ~/.loginverrà richiamato bashquando si accede.

Ho una situazione simile in cui vorrei utilizzare uno snippet simile per invocare una versione zshdiversa da quella predefinita con cui accedo. Parte del motivo per cui sto attraversando questo problema è perché non riesco a scegliere la mia versione desiderata di zshnelle opzioni consentite in chshe non ho i privilegi di amministratore.

Con questo:

  • Come cambierei lo snippet qui sopra per fare questo quando cambio tra le diverse versioni di zsh?
  • Perché sono execnecessari due comandi nel frammento sopra? Cosa fanno? Inoltre, perché utilizza lo snippet sopra ( sh e bash l'utente dovrebbe accedere con csh)

Risposte:


6

Se vuoi eseguire zsh invece di bash, sostituiscilo semplicemente /usr/local/bin/bashcon il percorso zshdell'eseguibile. Nota che questo frammento è specifico di csh; se la shell di login non è (t) csh, questo codice ~/.loginnon farà nulla per te.

Per quanto riguarda il motivo per cui lo snippet è stato scritto in questo modo, dovresti chiedere alla persona che lo ha scritto. [Verifica chi fosse.] Oh. Bene, se lo fai exec /usr/local/bin/bash, non avvierai una shell di login, quindi il tuo .profilenon verrà eseguito. Ma questo potrebbe essere risolto in un modo più semplice eseguendo /usr/local/bin/bash --login.

Ora, se la shell di accesso non è csh, ti consigliamo un frammento diverso in giro exec. Nelle shell in stile Bourne, incluso zsh:

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

Fare che exec ~/bin/zsh -lse si desidera che la nuova istanza di zsh per leggere il vostro ~/.zprofile. Nota che se lo fai, lo snippet sopra deve essere nel tuo .profileo .bash_profile; se la tua shell di login è zsh, non inserire lo snippet nel tuo .zprofile, altrimenti assicurati che la nuova istanza di zsh non lo chiamerà execpiù.


Grazie @Gilles. Ho scritto quanto segue sul mio.zprofile : if [[ $ZSH_VERSION != 4.3.14 ]]; then exec /n/sw/zsh-4.3.14/bin/zsh --login fie sembra funzionare!
Amelio Vazquez-Reina,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.