DotFiles/Shells/Zsh/mc alias

Материал из ALT Linux Wiki

< DotFiles | Shells | Zsh(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «Категория:DotFiles В ПРОЦЕССЕ НАПИСАНИЯ {{Stub}} >Если вызвать просто скрипт, то почему-то ниче...»)
(изменения при выборе /etc/shrc.d/)
 
(15 промежуточных версий не показаны.)
Строка 1: Строка 1:
[[Категория:DotFiles]]
[[Категория:DotFiles]]
-
В ПРОЦЕССЕ НАПИСАНИЯ
+
Проблема: в p6,p7,p8 в zsh 'из коробки' отсутствует поддержка mc
-
{{Stub}}
+
(смена текущей директории на посещенную в mc, alias mc='. /usr/lib/mc/mc-wrapper.sh') и другие alias'ы, имеющиеся в bash,
 +
не определяется корректно GPG_TTY и т.д.
-
>Если вызвать просто скрипт, то почему-то ничего не происходит, а если
+
текущий хак - вписать в .zshrc
-
>вызвать непосредственно саму команду, то она выполняется.  
+
alias mc >/dev/null || . /etc/zprofile
-
Скорее всего, скрипт выполняется в отдельном процессе, поэтому не
+
в чем суть проблемы? Поддержка mc реализована через alias.
-
создается алиас mc='. /usr/share/mc/bin/mc-wrapper.sh'
+
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'
-
в /etc/profile примерно такой код:
+
Чтобы каждый пользователь не прописывал эти алиасы у себя локально в .zshrc для zsh или .bashrc и не правил их при изменениях в пакетах, нужно общесистемное место, куда пакеты могут складывать свои shell alias.
-
for i in /etc/profile.d/*.sh; do
+
Традиционно в роли такого места выступал {{path|/etc/bashrc.d/}}.
-
    . $i # вызов скрипта в контексте текущего процесса
+
{{path|/etc/bashrc}} загружал {{path|/etc/bashrc.d/*.sh}}
-
done
+
а другие 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}}.
-
АС> Собственно чтение bashrc, насколько я понял, выполняется для
+
Однако {{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
-
По смыслу правильно было бы разделить sh- и bash-specific того, что
+
Сейчас наш {{path|/etc/zprofile}} в полном соответствии со стандартом
-
сейчас валится в /etc/bashrc.d, дабы bash читал свой /etc/bashrc.d, а
+
грузит {{path|/etc/profile}} который грузит {{path|/etc/profile.d/*.sh}}.
-
все sh-скрипты - какой-нибудь /etc/shrc.d
+
Получается, {{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/zprofile выполняется для login-шелла, возможно что zsh вызывается из эмулятора терминала, который запускает zsh без флага -l
+
В ALTLinux тоже предлагалось ввести {{path|/etc/shrc.d/}},
-
 
+
[https://lists.altlinux.org/pipermail/sisyphus/2008-March/329181.html (обсуждение)]
-
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://bugzilla.altlinux.org/show_bug.cgi?id=25703
 
-
* https://bugzilla.altlinux.org/show_bug.cgi?id=14641
 
-
* https://bugzilla.altlinux.org/show_bug.cgi?id=22859
 
-
* 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

Текущая версия на 17: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/*

Ссылки


 
Личные инструменты