DotFiles/Shells/Zsh/mc alias: различия между версиями

Материал из ALT Linux Wiki
< DotFiles‎ | Shells‎ | Zsh
Нет описания правки
 
(не показано 13 промежуточных версий этого же участника)
Строка 1: Строка 1:
[[Категория:DotFiles]]
[[Категория:DotFiles]]
{{Stub}}


Проблема: в p6,p7,p8 в zsh 'из коробки' отсутствует поддержка mc
Проблема: в p6,p7,p8 в zsh 'из коробки' отсутствует поддержка mc
(смена текущей директории на посещенную в mc, alias mc='. /usr/lib/mc/mc-wrapper.sh') и другие alias'ы, имеющиеся в bash.
(смена текущей директории на посещенную в mc, alias mc='. /usr/lib/mc/mc-wrapper.sh') и другие alias'ы, имеющиеся в bash,
не определяется корректно GPG_TTY и т.д.


текущий хак - вписать в .zshrc
текущий хак - вписать в .zshrc
Строка 13: Строка 12:
поэтому их нужно объявлять каждый раз при запуске shell.
поэтому их нужно объявлять каждый раз при запуске shell.
Кроме того, alias mc жестко зависит от текущей сборки mc.
Кроме того, 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.
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.d/}}.
Строка 29: Строка 23:
а другие shells (в т.ч. zsh) для совместимости загружали {{path|/etc/bashrc}}.
а другие shells (в т.ч. zsh) для совместимости загружали {{path|/etc/bashrc}}.


* https://bugzilla.altlinux.org/show_bug.cgi?id=25703
Но со временем в {{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=14641
* https://bugzilla.altlinux.org/show_bug.cgi?id=22859
* 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 и других плюшек там нет.


в /etc/profile примерно такой код:
Эту проблему надо решить на дистрибутивном уровне.


for i in /etc/profile.d/*.sh; do
В fedora, mageia, rosa пошли по пути загрузки {{path|/etc/profile.d/*.sh}} в {{path|/etc/zshrc}}:
    . $i # загрузка скрипта в контексте текущего процесса
<source lang="bash">
for profile_func in /etc/profile.d/*.sh
do
        emulate -R sh -c "source $profile_func"
done
done
unset profile_func
</source>
В PLD Linux добавили для таких файлов отдельный каталог {{path|/etc/shrc.d/}},
откуда их должны загружать различные {{path|/etc/*shrc}}:


>Не работает под обычными пользователями
В ALTLinux тоже предлагалось ввести {{path|/etc/shrc.d/}},
 
[https://lists.altlinux.org/pipermail/sisyphus/2008-March/329181.html (обсуждение)]
 
но, видимо, руки не дошли.
По смыслу правильно было бы разделить 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


Эту проблему надо решить и в 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]
* 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
* 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 пришлось отказаться, см.

а поскольку 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/*

Ссылки