Udostępniaj aliasy i ustawienia PATH pomiędzy zsh i bash

24

Powłoka, której zwykle używam, to zsh. Mam kilka aliasów, aby włączyć kolor w niektórych programach, takich jak lsi grep. Ustawiłem także własną ścieżkę, aby móc uruchamiać programy w niestandardowym miejscu (np. In ~/bin/).

I nie zmieni powłoki roota do zsh, ale chciałbym podzielić te ustawienia tak, że root może mieć równie dobrze. Dowiaduję się, że zshto nie jest pozyskiwanie /etc/profile. Mogę to zdobyć /etc/zsh/zprofile, ale chciałbym w inny, bardziej „właściwy” sposób.

phunehehe
źródło

Odpowiedzi:

16

Utworzyłbym plik /etc/commonprofilei źródło w obu /etc/profilei /etc/zsh/zprofile. Daje to możliwość dzielenia wspólnych ustawień i nadal cię wykorzystać bashodpowiednio zshkonkretne ustawienia i składni w /etc/profileodpowiednio zprofile.

fschmitt
źródło
wśród innych dobrych odpowiedzi uważam, że ten odpowiada mi najlepszy, stosunkowo prosty i „czysty”
phunehehe
co rozumiesz przez „źródło”?
Hlung
@Hlung Aby załadować zrozumiałość profilu powłoki, tutaj jest „source /path/to/.shell_profile”. Zobacz stronę podręcznika w 'źródle'.
Itachi,
17

Zsh ma tryb kompatybilności sh, który pozwoli mu wykonać kod sh POSIX i niektóre rozszerzenia bash. Dopóki nie używasz funkcji bash, których nie ma zsh (z tą samą składnią), możesz mieć ten sam plik pochodzący z obu powłok. Użyj emulatewbudowanego, aby przełączyć zsh w tryb zgodności; z tą -Lopcją emulacja jest lokalna dla funkcji zamykającej (a nie załączającego skryptu źródłowego).

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

W przypadku takich zmiennych środowiskowych można używać source_sh /etc/profiledo /etc/zprofilei source_sh ~/.profilez ~/.zprofile, ponieważ pliki profilu prawdopodobnie nie będą używać funkcji specyficznych dla bash.

Na takie rzeczy jak aliasów i definicji funkcji, ponieważ pliki powłoki rc prawdopodobnie zawierają wiele rzeczy, które nie mogą być udostępniane (Podpowiedź, kluczowych powiązań, ustawienia zakończeniu, ...), należy jak plik ~/.sh_aliases, który jest pozyskiwany w ~/.bashrci source_sh„d w ~/.zshrc.

Gilles „SO- przestań być zły”
źródło
2
Powinien istnieć sposób na powiedzenie „automatycznie głosuj na wszystkie odpowiedzi Gillesa”. Zaoszczędzi mi to trochę czasu. Nie, naprawdę, twoje odpowiedzi są niesamowite. Zawsze dokładny, dobrze napisany i kompleksowy.
fschmitt
@fschmitt: Zgadzam się. I widać, że nawet nie jest edytowany! Ta podana tu wskazówka jest naprawdę dobra.
Ktoś nadal cię używa MS-DOS
4

Co z prostym dowiązaniem symbolicznym?

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

Możesz także dołączyć coś takiego, jeśli potrzebujesz warunkowej inicjalizacji:

#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
źródło
Hmm, ale nie sądzę, że będzie to czystsze niż pozyskiwanie. Czy istnieje plik, który odczytają zarówno Zsh, jak i Bash?
phunehehe
co sprawia, że ​​uważasz, że pozyskiwanie lub tworzenie dowiązań symbolicznych nie jest rozwiązaniem „czystym”?
echox
Chciałem tylko powiedzieć, że w razie potrzeby wolę źródło pliku, niż zarządzanie dowiązaniem symbolicznym. Nie chcę tworzyć dużej zależności między plikami.
phunehehe 24.10.10
1
Bardziej przenośna alternatywa dla /bin/ls -l /proc/$$/exeto ps -o comm= -p $$. Nie jest to w pełni niezawodne, ponieważ niektóre powłoki zachowują się inaczej w zależności od sposobu ich wywołania; w praktyce po prostu testuje $0się .profilebędzie prawdopodobnie lepszy wskazanie. Ale większość muszli, które oferują użytecznych funkcji (bash, ksh, zsh) można po prostu uznawane (i ich wersja zidentyfikowane, co jest dużym plusem) testując kilka zmiennych: $BASH, $BASH_VERSION, $BASH_VERSINFO; $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
Gilles 'SO - przestań być zły'
echox, instrukcja case nie wykrywa poprawnie zsh4 # Określ naszą powłokę bez użycia $ SHELL, która może leżeć w powłoce = "sh", jeśli test -f / proc / mounts; następnie case $ (/ bin / ls -l / proc / $$ / exe) w bash) shell = bash ;; * kreska) shell = kreska ;; * jesion) skorupa = jesion ;; * ksh) shell = ksh ;; * zsh ) shell = zsh ;; #matches zsh4 esac fi
Bryan Hunt
0

Jeśli chodzi o zmienne, mam wrażenie, że brakuje wam modułów i plików modułów [1]. Gdy zaczniesz to robić, łatwo będzie utworzyć wspólne profile dla różnych powłok (w tym bash i zsh), python, perl i jeszcze więcej środowisk, a wszystko to z wygody pojedynczego pliku modułu.

Możliwe jest również zdefiniowanie aliasów w ten sam sposób; szybko jednak przekonasz się, że aliasy nie są dobrze dziedziczone między kolejnymi powłokami i mogą wymagać obejścia.

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

fgeorgatos
źródło