Condividi alias e impostazione PATH tra zsh e bash


24

La shell che uso normalmente è zsh. Ho diversi alias per abilitare il colore in alcuni programmi come lse grep. Ho anche impostato il mio percorso personalizzato in modo da poter eseguire i programmi in un posto non standard (come in ~/bin/).

Io non voglio cambiare la shell di root per zsh, ma vorrei condividere queste impostazioni in modo che root può avere pure. Scopro che zshnon si tratta di approvvigionamento /etc/profile. Posso procurarmelo /etc/zsh/zprofile, ma vorrei un altro modo più "corretto".

Risposte:


16

Creerei un file /etc/commonprofilee lo sorgente in entrambi /etc/profilee /etc/zsh/zprofile. Ciò ti dà la possibilità di condividere le impostazioni comuni e comunque di utilizzare bashrispettivamente zshimpostazioni e sintassi specifiche /etc/profilerispettivamente zprofile.


tra le altre buone risposte penso che questo mi
vada

cosa intendi per "fonte"?
Hlung,

@Hlung Per caricare l'esplicabilità del profilo della shell, ecco che arriva 'source /path/to/.shell_profile'. Vedi la pagina man su 'source'.
Itachi,

17

Zsh ha una modalità di compatibilità sh che gli permetterà di eseguire il codice sh POSIX e alcune estensioni bash. Finché non usi le funzionalità bash che zsh non ha (con la stessa sintassi), puoi avere lo stesso file proveniente da entrambe le shell. Usa il emulatebuilt-in per mettere zsh in modalità compatibilità; con l' -Lopzione, l'emulazione è locale alla funzione che racchiude (non lo script di provenienza allegato).

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

Per cose come le variabili di ambiente, è possibile utilizzare source_sh /etc/profilein /etc/zprofilee source_sh ~/.profilein ~/.zprofile, poiché è probabile che i file di profilo non utilizzino funzionalità specifiche di bash.

Per cose come gli alias e le definizioni delle funzioni, poiché è probabile che i file shell rc contengano molte cose che non possono essere condivise (prompt, associazioni di tasti, impostazioni di completamento, ...), utilizzare un file come ~/.sh_aliasesquello che proviene ~/.bashrce source_sh'd in ~/.zshrc.


2
Dovrebbe esserci un modo per dire "vota automaticamente tutte le risposte di Gilles". Questo mi farebbe risparmiare un bel po 'di tempo. No davvero, le tue risposte oscillano. Sempre accurato, ben scritto e completo.
fschmitt,

@fschmitt: sono d'accordo. E puoi vedere che non è nemmeno stato modificato! Questo suggerimento fornito qui è davvero buono.
Qualcuno usa ancora MS-DOS il

4

Che dire di un semplice link simbolico?

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

Puoi anche aggiungere qualcosa di simile se hai bisogno di un'inizializzazione condizionale:

#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

Hmm, ma non penso che questo sarà più pulito del sourcing. Esiste un file che sia zsh che bash leggeranno?
phunehehe,

cosa ti fa pensare che l'approvvigionamento o la creazione di un collegamento simbolico non sia una soluzione "pulita"?
echox,

Volevo solo dire, se necessario, mi piacerebbe creare il file anziché gestire il collegamento simbolico. Non voglio creare molta dipendenza tra i file.
phunehehe,

1
Un'alternativa più portatile /bin/ls -l /proc/$$/exeè ps -o comm= -p $$. Questo non è completamente affidabile perché alcune shell si comportano diversamente a seconda di come sono state invocate; in pratica il semplice test $0in .profileè probabilmente un'indicazione migliore. Ma la maggior parte conchiglie che offrono caratteristiche utili (bash, ksh, zsh) possono essere semplicemente riconosciuti (e la loro versione identificata, che è un grande vantaggio) testando alcune variabili: $BASH, $BASH_VERSION, $BASH_VERSINFO; $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
Gilles 'SO- smetti di essere malvagio' il

echox, l'istruzione case non rileva correttamente zsh4 # Determina la nostra shell senza usare $ SHELL, che può trovarsi shell = "sh" se test -f / proc / monta; quindi case $ (/ bin / ls -l / proc / $$ / exe) in bash) shell = bash ;; * dash) shell = dash ;; * ash) shell = ash ;; * ksh) shell = ksh ;; * zsh ) shell = zsh ;; #matches zsh4 esac fi
Bryan Hunt,

0

Per quanto riguarda le variabili, ho l'impressione che manchi moduli e moduli [1]. Una volta che inizi a farlo, sarà facile creare profili comuni per varie shell (inclusi bash e zsh), python, perl e anche più ambienti, il tutto dalla comodità di un singolo file di modulo.

È anche possibile definire gli alias allo stesso modo; tuttavia, scoprirai rapidamente che gli alias non vengono ereditati molto bene tra le shell successive e potrebbero aver bisogno di soluzioni alternative.

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

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.