Совместное использование псевдонимов и настроек PATH между zsh и bash

24

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

Я не буду менять оболочку root на zsh, но я хотел бы поделиться этими настройками, чтобы root мог иметь ее. Я узнаю, что zshэто не источник /etc/profile. Я могу найти его /etc/zsh/zprofile, но я бы хотел другой, более «правильный» способ.

phunehehe
источник

Ответы:

16

Я бы создать файл /etc/commonprofileи источник его как /etc/profileи /etc/zsh/zprofile. Это дает вам возможность поделиться общими настройками и при этом использовать bashсоответственно zshопределенные настройки и синтаксис /etc/profileсоответственно zprofile.

fschmitt
источник
среди других хороших ответов я думаю, что этот подходит мне лучше всего, относительно простой и «чистый»
phunehehe
что вы подразумеваете под "источником его"?
Хлунг
@Hlung Для загрузки эксплицитности профиля оболочки, здесь идет 'source /path/to/.shell_profile'. Смотрите man-страницу «source».
Итачи
17

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

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

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

Для таких вещей , как псевдонимы и определение функций, так как оболочка радиоуправляемых файлы, вероятно, содержит много вещей , которые не могут быть разделены (Prompt, привязки клавиша, параметры завершения, ...), используйте файл как ~/.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
echox
источник
Хм, но я не думаю, что это будет чище, чем его поиск. Есть ли файл, который будут читать как zsh, так и bash?
phunehehe
с чего вы взяли, что поиск или создание символической ссылки не является «чистым» решением?
echox 23.10.10
Я просто хотел сказать, что в случае необходимости я хотел бы получить исходный файл, а не управлять символической ссылкой. Я не хочу создавать большую зависимость между файлами.
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, ваша инструкция case не правильно определяет zsh4 # Определите нашу оболочку без использования $ SHELL, который может лежать shell = "sh", если test -f / proc / mounts; тогда регистр $ (/ bin / ls -l / proc / $$ / exe) в bash) shell = bash ;; * тире) shell = тире ;; * зола) скорлупа = зола ;; * ksh) shell = ksh ;; * zsh ) shell = zsh ;; #matches zsh4 esac fi
Брайан Хант
0

Что касается переменных, у меня сложилось впечатление, что вам не хватает modules & modulefiles [1]. Как только вы начнете это делать, вам будет легко создавать общие профили для различных оболочек (в том числе bash & zsh), python, perl и даже большего количества сред - все из удобства одного файла модуля.

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

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

fgeorgatos
источник