Teilen Sie Aliase und PATH-Einstellungen zwischen zsh und bash

24

Die Shell, die ich normalerweise benutze, ist zsh. Ich habe mehrere Aliase, um Farbe in einigen Programmen wie lsund zu aktivieren grep. Ich habe auch meinen benutzerdefinierten Pfad so festgelegt, dass ich Programme an einem nicht standardmäßigen Ort ausführen kann (z. B. in ~/bin/).

Ich werde nicht root Shell ändern zu zsh, aber ich möchte diese Einstellung teilen , so dass root es auch haben kann. Ich finde heraus, dass zshdas kein Sourcing ist /etc/profile. Ich kann es einlesen /etc/zsh/zprofile, aber ich hätte gerne einen anderen "richtigen" Weg.

phunehehe
quelle

Antworten:

16

Ich würde eine Datei erstellen /etc/commonprofileund beziehen sie in beide /etc/profileund /etc/zsh/zprofile. Auf diese Weise haben Sie die Möglichkeit, gemeinsame Einstellungen zu verwenden und weiterhin bashjeweils zshbestimmte Einstellungen und Syntax zu /etc/profileverwenden zprofile.

fschmitt
quelle
neben anderen guten antworten finde ich passt mir dieser am besten, relativ einfach und "sauber"
phunehehe
was meinst du mit "source it"?
Hlung
@Hlung Zum Laden der Shell-Profil-Explizilität finden Sie hier die 'source /path/to/.shell_profile'. Siehe Manpage zu 'source'.
Itachi
17

Zsh verfügt über einen sh-Kompatibilitätsmodus, mit dem POSIX-sh-Code und einige Bash-Erweiterungen ausgeführt werden können. Solange Sie keine bash-Funktionen verwenden, die zsh nicht hat (mit derselben Syntax), können Sie dieselbe Datei von beiden Shells beziehen. Verwenden Sie das emulateintegrierte Tool, um zsh in den Kompatibilitätsmodus zu versetzen. Mit dieser -LOption ist die Emulation lokal für die einschließende Funktion (nicht für das einschließende Skript).

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

Für Dinge wie Umgebungsvariablen können Sie source_sh /etc/profilein /etc/zprofileund source_sh ~/.profilein verwenden ~/.zprofile, da die Profildateien wahrscheinlich keine bash-spezifischen Funktionen verwenden.

Verwenden Sie für Aliase und Funktionsdefinitionen eine Datei wie ~/.sh_aliasesdie in ~/.bashrcund source_sh'd in ~/.zshrc.

Gilles 'SO - hör auf böse zu sein'
quelle
2
Es sollte eine Möglichkeit geben zu sagen, dass alle Antworten von Gilles automatisch positiv bewertet werden. Das würde mir ziemlich viel Zeit sparen. Nein wirklich, deine Antworten rocken. Immer genau, gut geschrieben und umfassend.
Fschmitt
@fschmitt: da stimme ich zu Und Sie können sehen, dass es nicht einmal bearbeitet wird! Dieser Hinweis ist wirklich gut.
Jemand verwendet Sie immer noch MS-DOS
4

Was ist mit einem einfachen Symlink?

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

Sie können auch so etwas anhängen, wenn Sie eine bedingte Initialisierung benötigen:

#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
quelle
Hmm, aber ich denke nicht, dass dies sauberer sein wird, als es zu beschaffen. Gibt es eine Datei, die sowohl von zsh als auch von bash gelesen wird?
Phunehehe
Was lässt Sie denken, dass die Beschaffung oder Erstellung eines Symlinks keine "saubere" Lösung ist?
Echox
Ich wollte nur sagen, wenn nötig, ich würde die Datei lieber als Quelle verwenden, anstatt den Symlink zu verwalten. Ich möchte keine großen Abhängigkeiten zwischen Dateien herstellen.
Phunehehe
1
Eine tragbarere Alternative zu /bin/ls -l /proc/$$/exeist ps -o comm= -p $$. Dies ist nicht vollständig zuverlässig, da sich einige Shells je nach Aufruf unterschiedlich verhalten. in der Praxis einfach testet $0in .profileist wahrscheinlich eine bessere Anzeige zu sein. Aber die meisten Muscheln , die nützliche Funktionen (bash, ksh, zsh) bieten kann einfach erkannt werden (und ihre Version identifiziert, die ein großes Plus) durch einige Variablen testen: $BASH, $BASH_VERSION, $BASH_VERSINFO; $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
Gilles 'SO- hör auf böse zu sein'
echox, Ihre case-Anweisung erkennt zsh4 nicht richtig. dann case $ (/ bin / ls -l / proc / $$ / exe) in bash) shell = bash ;; * dash) shell = dash ;; * Asche) Schale = Asche ;; * ksh) shell = ksh ;; * zsh ) shell = zsh ;; #matches zsh4 esac fi
Bryan Hunt
0

Bei den Variablen habe ich den Eindruck, dass Ihnen Module & Moduldateien fehlen [1]. Sobald Sie damit beginnen, ist es einfach, allgemeine Profile für verschiedene Shells (einschließlich Bash & Zsh), Python, Perl und noch mehr Umgebungen zu erstellen, und das alles aus einer einzigen Moduldatei heraus.

Es ist auch möglich, Aliase auf die gleiche Weise zu definieren. Sie werden jedoch schnell feststellen, dass Aliase zwischen aufeinander folgenden Shells nicht sehr gut vererbt werden und möglicherweise Problemumgehungen benötigen.

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

fgeorgatos
quelle