DotFiles/Shells/Zsh/mc alias: различия между версиями
Нет описания правки |
Нет описания правки |
||
Строка 13: | Строка 13: | ||
поэтому их нужно объявлять каждый раз при запуске shell. | поэтому их нужно объявлять каждый раз при запуске shell. | ||
Кроме того, alias mc жестко зависит от текущей сборки mc. | Кроме того, alias mc жестко зависит от текущей сборки mc. | ||
У нас в текущем сизифе это | |||
alias mc='. /usr/lib/mc/mc-wrapper.sh | |||
alias mc='. /usr/lib/mc/mc-wrapper.sh | но, к примеру, в debian это | ||
но в debian | alias mc='. /usr/share/mc/bin/mc-wrapper.sh' | ||
alias mc='. /usr/share/mc/bin/mc-wrapper.sh' | |||
Чтобы каждый пользователь не прописывал эти алиасы у себя локально в .zshrc для zsh или .bashrc и не правил их при изменениях в пакетах, нужно общесистемное место, куда пакеты могут складывать свои shell alias. | Чтобы каждый пользователь не прописывал эти алиасы у себя локально в .zshrc для zsh или .bashrc и не правил их при изменениях в пакетах, нужно общесистемное место, куда пакеты могут складывать свои shell alias. | ||
Строка 45: | Строка 44: | ||
см. тж. | см. тж. | ||
* https://bugzilla.altlinux.org/show_bug.cgi?id=25703 | * https://bugzilla.altlinux.org/show_bug.cgi?id=25703 | ||
При чем похожее произошло и в других дистрибутивах, | При чем похожее произошло и в других дистрибутивах. | ||
Более того, во многих дистрибутивах сейчас {{path|/etc/zshrc}} для совместимости загружает {{path|/etc/profiles}}. | |||
Однако {{path|/etc/profiles}} и {{path|/etc/profiles.d/}}, вообще говоря, не подходящее место для shell alias'ов. | |||
Согласно [http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/etc.html Linux Standard Base Core Specification], это место для скриптов, выполняемых в login shell. | |||
/etc/profile.d - A directory containing shell scripts. | |||
The sh utility shall read [...] the shell scripts in this directory [...] | |||
when invoked as an interactive login shell, or if the -l is specified | |||
В полном соответствии со стандартом, {{path|/etc/zprofile}} грузит {{path|/etc/profile}} который грузит {{path|/etc/zprofile.d/*.sh}}. | |||
{{path|/etc/profile}} выполняется для login-шелла. | |||
В ПРОЦЕССЕ НАПИСАНИЯ | В ПРОЦЕССЕ НАПИСАНИЯ | ||
По смыслу правильно было бы разделить sh- и bash-specific того, что | По смыслу правильно было бы разделить sh- и bash-specific того, что | ||
сейчас валится в /etc/bashrc.d, дабы bash читал свой /etc/bashrc.d, а | сейчас валится в /etc/bashrc.d, дабы bash читал свой /etc/bashrc.d, а | ||
все sh-скрипты - какой-нибудь /etc/shrc.d | все sh-скрипты - какой-нибудь /etc/shrc.d | ||
Версия от 21:14, 23 октября 2016
Проблема: в p6,p7,p8 в zsh 'из коробки' отсутствует поддержка mc
(смена текущей директории на посещенную в mc, alias mc='. /usr/lib/mc/mc-wrapper.sh') и другие alias'ы, имеющиеся в bash.
текущий хак - вписать в .zshrc
alias mc >/dev/null || . /etc/zprofile
в чем суть проблемы? Поддержка mc реализована через alias. alias'ы не передаются от родительского shell к shell потомку, поэтому их нужно объявлять каждый раз при запуске shell. Кроме того, alias mc жестко зависит от текущей сборки mc. У нас в текущем сизифе это
alias mc='. /usr/lib/mc/mc-wrapper.sh
но, к примеру, в debian это
alias mc='. /usr/share/mc/bin/mc-wrapper.sh'
Чтобы каждый пользователь не прописывал эти алиасы у себя локально в .zshrc для zsh или .bashrc и не правил их при изменениях в пакетах, нужно общесистемное место, куда пакеты могут складывать свои shell alias.
Традиционно в роли такого места выступал /etc/bashrc.d/. /etc/bashrc загружал /etc/bashrc.d/*.sh а другие shells (в т.ч. zsh) для совместимости загружали /etc/bashrc.
Но со временем в /etc/bashrc.d/*.sh появились специфические только для bash команды, не совместимые с остальными shell, и от загрузки /etc/bashrc в /etc/zshrc пришлось отказаться, см.
- https://lists.altlinux.org/pipermail/sisyphus/2008-March/329166.html
- https://lists.altlinux.org/pipermail/sisyphus/2008-March/329210.html
- https://lists.altlinux.org/pipermail/sisyphus/2008-March/329181.html
- https://bugzilla.altlinux.org/show_bug.cgi?id=14641
- https://bugzilla.altlinux.org/show_bug.cgi?id=22859
а поскольку alias'ы надо же куда-то складывать, то они начали скапливаться в /etc/profile.d/. К примеру, на моей машине
$ grep -rl alias /etc/profile.d/* /etc/profile.d/color_grep.csh /etc/profile.d/color_grep.sh /etc/profile.d/color_ls.csh /etc/profile.d/color_ls.sh /etc/profile.d/mc.csh /etc/profile.d/mc.sh
см. тж.
При чем похожее произошло и в других дистрибутивах. Более того, во многих дистрибутивах сейчас /etc/zshrc для совместимости загружает /etc/profiles.
Однако /etc/profiles и /etc/profiles.d/, вообще говоря, не подходящее место для shell alias'ов. Согласно Linux Standard Base Core Specification, это место для скриптов, выполняемых в login shell.
/etc/profile.d - A directory containing shell scripts. The sh utility shall read [...] the shell scripts in this directory [...] when invoked as an interactive login shell, or if the -l is specified
В полном соответствии со стандартом, /etc/zprofile грузит /etc/profile который грузит /etc/zprofile.d/*.sh. /etc/profile выполняется для login-шелла.
В ПРОЦЕССЕ НАПИСАНИЯ
По смыслу правильно было бы разделить sh- и bash-specific того, что сейчас валится в /etc/bashrc.d, дабы bash читал свой /etc/bashrc.d, а все sh-скрипты - какой-нибудь /etc/shrc.d
/etc/zprofile выполняется для login-шелла, возможно что zsh вызывается из эмулятора терминала, который запускает zsh без флага -l
if $SHLVL == 1 && ! -o LOGIN ; then
source ~/.zprofile
fi
Ссылки
- /etc/profile.d in Linux Standard Base Core Specification
- http://stackoverflow.com/questions/10574684/where-to-place-path-variable-assertions-in-zsh
- http://superuser.com/questions/187639/zsh-not-hitting-profile