DotFiles/Shells/Zsh/mc alias: различия между версиями
(Новая страница: «Категория:DotFiles В ПРОЦЕССЕ НАПИСАНИЯ {{Stub}} >Если вызвать просто скрипт, то почему-то ниче...») |
|||
(не показано 15 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
[[Категория:DotFiles]] | [[Категория:DotFiles]] | ||
Проблема: в p6,p7,p8 в zsh 'из коробки' отсутствует поддержка mc | |||
(смена текущей директории на посещенную в mc, alias mc='. /usr/lib/mc/mc-wrapper.sh') и другие alias'ы, имеющиеся в bash, | |||
не определяется корректно GPG_TTY и т.д. | |||
текущий хак - вписать в .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. | ||
Традиционно в роли такого места выступал {{path|/etc/bashrc.d/}}. | |||
{{path|/etc/bashrc}} загружал {{path|/etc/bashrc.d/*.sh}} | |||
а другие shells (в т.ч. zsh) для совместимости загружали {{path|/etc/bashrc}}. | |||
Но со временем в {{path|/etc/bashrc.d/*.sh}} появились специфические | |||
только для {{prg|bash}} команды, не совместимые с остальными shell, | |||
и от загрузки {{path|/etc/bashrc}} в {{path|/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'ы надо же куда-то складывать, то | |||
они начали скапливаться в {{path|/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 | |||
см. тж. | |||
* 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/profile.d/*.sh}}. | |||
Получается, {{path|/etc/profile}} выполняется для login-шелла. | |||
И в login-zsh (например, залогинившись на tty2) есть поддержка mc и все плюшки. | |||
Но запущенные в X терминалы "из коробки" не являются login shell | |||
(хотя их можно так настроить; это будет альтернативный хак) и "из коробки" | |||
поддержки mc и других плюшек там нет. | |||
Эту проблему надо решить на дистрибутивном уровне. | |||
В fedora, mageia, rosa пошли по пути загрузки {{path|/etc/profile.d/*.sh}} в {{path|/etc/zshrc}}: | |||
<source lang="bash"> | |||
for profile_func in /etc/profile.d/*.sh | |||
do | |||
emulate -R sh -c "source $profile_func" | |||
done | |||
unset profile_func | |||
</source> | |||
В PLD Linux добавили для таких файлов отдельный каталог {{path|/etc/shrc.d/}}, | |||
откуда их должны загружать различные {{path|/etc/*shrc}}: | |||
/etc/ | В ALTLinux тоже предлагалось ввести {{path|/etc/shrc.d/}}, | ||
[https://lists.altlinux.org/pipermail/sisyphus/2008-March/329181.html (обсуждение)] | |||
но, видимо, руки не дошли. | |||
Эту проблему надо решить и в ALTLinux. | |||
Можно пойти по пути fedora, mageia, rosa и грузить {{path|/etc/profile.d/*.sh}} в {{path|/etc/zshrc}}. | |||
Я сторонник того, чтобы ввести {{path|/etc/shrc.d/}}, переместить туда скрипты с alias'ами | |||
и грузить в {{path|/etc/zshrc}} только их. | |||
== изменения при выборе /etc/shrc.d/ == | |||
* setup | |||
** добавить {{path|/etc/shrc.d/}} и возможно {{path|/etc/shrc}} | |||
** в {{path|/etc/csh.cshrc}} добавить загрузку {{path|/etc/shrc.d/*.сsh}} | |||
** заодно освежить: вписать bash4 в /etc/shells, убрать /usr/X11R6/bin из $PATH. | |||
* bash, bash4, zsh -- в /etc/<name>rc скрипты добавить загрузку {{path|/etc/shrc.d/*.sh}} либо {{path|/etc/shrc}} | |||
* тест repocop который будет выявлять alias'ы в {{path|/etc/profile.d/*}} | |||
== Ссылки == | == Ссылки == | ||
* [http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/etc.html /etc/profile.d in Linux Standard Base Core Specification] | * [http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/etc.html /etc/profile.d in Linux Standard Base Core Specification] | ||
* http://stackoverflow.com/questions/10574684/where-to-place-path-variable-assertions-in-zsh | * http://stackoverflow.com/questions/10574684/where-to-place-path-variable-assertions-in-zsh | ||
* http://superuser.com/questions/187639/zsh-not-hitting-profile | * http://superuser.com/questions/187639/zsh-not-hitting-profile |
Текущая версия от 20:45, 24 октября 2016
Проблема: в p6,p7,p8 в zsh 'из коробки' отсутствует поддержка mc
(смена текущей директории на посещенную в mc, alias mc='. /usr/lib/mc/mc-wrapper.sh') и другие alias'ы, имеющиеся в bash,
не определяется корректно GPG_TTY и т.д.
текущий хак - вписать в .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/profile.d/*.sh. Получается, /etc/profile выполняется для login-шелла. И в login-zsh (например, залогинившись на tty2) есть поддержка mc и все плюшки. Но запущенные в X терминалы "из коробки" не являются login shell (хотя их можно так настроить; это будет альтернативный хак) и "из коробки" поддержки mc и других плюшек там нет.
Эту проблему надо решить на дистрибутивном уровне.
В fedora, mageia, rosa пошли по пути загрузки /etc/profile.d/*.sh в /etc/zshrc:
for profile_func in /etc/profile.d/*.sh
do
emulate -R sh -c "source $profile_func"
done
unset profile_func
В PLD Linux добавили для таких файлов отдельный каталог /etc/shrc.d/, откуда их должны загружать различные /etc/*shrc:
В ALTLinux тоже предлагалось ввести /etc/shrc.d/, (обсуждение) но, видимо, руки не дошли.
Эту проблему надо решить и в ALTLinux. Можно пойти по пути fedora, mageia, rosa и грузить /etc/profile.d/*.sh в /etc/zshrc. Я сторонник того, чтобы ввести /etc/shrc.d/, переместить туда скрипты с alias'ами и грузить в /etc/zshrc только их.
изменения при выборе /etc/shrc.d/
- setup
- добавить /etc/shrc.d/ и возможно /etc/shrc
- в /etc/csh.cshrc добавить загрузку /etc/shrc.d/*.сsh
- заодно освежить: вписать bash4 в /etc/shells, убрать /usr/X11R6/bin из $PATH.
- bash, bash4, zsh -- в /etc/<name>rc скрипты добавить загрузку /etc/shrc.d/*.sh либо /etc/shrc
- тест repocop который будет выявлять alias'ы в /etc/profile.d/*
Ссылки
- /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