Поділіться псевдонімами та налаштуваннями PATH між zsh та bash


24

Оболонка, якою я зазвичай користуюся, є zsh. У мене є кілька псевдонімів, щоб увімкнути колір у деяких програмах, таких як lsі grep. Я також встановив свій власний шлях, щоб я міг виконувати програми в нестандартному місці (наприклад, в ~/bin/).

Я не буду змінювати оболонку кореня на zsh, але я хотів би поділитися цими налаштуваннями, щоб і корінь міг її мати. Я з’ясовую, що zshце не джерело /etc/profile. Я можу це джерело /etc/zsh/zprofile, але я хотів би ще якийсь "правильний" спосіб.

Відповіді:


16

Я б створив файл /etc/commonprofileі джерело його в обох /etc/profileі /etc/zsh/zprofile. Це дає вам можливість ділитися загальними налаштуваннями та все ж використовувати bashвідповідно zshпевні налаштування та синтаксис /etc/profileвідповідно zprofile.


серед інших хороших відповідей, я думаю, що цей підходить мені найкращим, відносно простим і «чистим»
phunehehe

що ти маєш на увазі під "джерелом"?
Hlung

@Hlung Для завантаження чіткості профілю оболонки, тут з'являється 'source /path/to/.shell_profile'. Див. Сторінку чоловіка у "джерелі"
Ітачі

17

Zsh має режим сумісності sh, який дозволить виконувати код POSIX sh та деякі розширення bash. Поки ви не використовуєте функції bash, яких zsh не має (з тим самим синтаксисом), ви можете мати один і той самий файл, обидва оболонки. Використовуйте emulateвбудований для переведення zsh в режим сумісності; з -Lможливістю, емуляція є локальною функцією, що додає (а не скриптом, що додається).

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

Для таких речей, як змінні середовища, ви можете використовувати source_sh /etc/profileв /etc/zprofileі source_sh ~/.profileв ~/.zprofile, оскільки файли профілів, ймовірно, не використовують функції, характерні для bash.

Для таких речей, як псевдоніми та визначення функцій, оскільки файли rc оболонки, ймовірно, містять багато речей, які не можна спільно використовувати (підказки, прив'язки клавіш, налаштування завершення…), використовуйте такий файл, ~/.sh_aliasesякий міститься в ~/.bashrcі source_sh'd в ~/.zshrc.


2
Повинен бути спосіб сказати "автоматично підкріплювати всі відповіді Жиля". Це дозволило б заощадити мені досить багато часу. Ні, насправді, відповіді ваші. Завжди точний, добре написаний та вичерпний.
fschmitt

@fschmitt: Я згоден. І ви можете бачити, що це навіть не відредаговано! Цей натяк, наданий тут, справді хороший.
Хтось досі використовує вас MS-DOS

4

Що про просту симпосилання?

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

Ви також можете додати щось подібне, якщо вам потрібна умовна ініціалізація:

#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

Хм, але я не думаю, що це буде чистішим, ніж джерело. Чи є файл, який зчитують і zsh, і bash?
phunehehe

що змушує вас думати, що пошук або створення симпосилання не є "чистим" рішенням?
ехокс

Я просто хотів сказати, якщо потрібно, я хотів би створити файл, а не керувати символьним посиланням. Я не хочу створювати велику залежність між файлами.
phunehehe

1
Більш портативна альтернатива /bin/ls -l /proc/$$/exeє ps -o comm= -p $$. Це не повністю надійно, оскільки деякі снаряди поводяться по-різному залежно від способу виклику; на практиці просто тестування $0в .profile, ймовірно, буде кращим показником. Але більшість оболонок , які пропонують корисні функції (баш, КШ, ЗШ) може бути просто визнана (і їх версії визначили, що великий плюс) шляхом тестування деяких змінних: $BASH, $BASH_VERSION, $BASH_VERSINFO; $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
Жил "ТАК - перестань бути злим"

echox, ваш випадок невірно виявляє zsh4 # Визначте нашу оболонку без використання $ SHELL, яка може лежати shell = "sh", якщо тест -f / proc / mounts; тоді випадок $ (/ bin / ls -l / proc / $$ / exe) у bash) shell = bash ;; * тире) оболонка = тире ;; * зола) оболонка = зола ;; * ksh) оболонка = ksh ;; * zsh ) shell = zsh ;; #matches zsh4 esac fi
Брайан Хант

0

Щодо змінних, у мене складається враження, що у вас відсутні модулі та модулі файлів [1]. Після того, як ви почнете це робити, буде легко створити загальні профілі для різних оболонок (включаючи bash & zsh), python, perl та навіть більше середовищ - все це зручно для одного файлу модуля.

Так само можна визначити псевдоніми; однак ви швидко виявите, що псевдоніми не успадковуються дуже добре між послідовними оболонками і можуть знадобитися обхідні шляхи.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.