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

Материал из ALT Linux Wiki
< DotFiles‎ | Shells‎ | Zsh
Нет описания правки
Нет описания правки
Строка 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/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-шелла.


В ПРОЦЕССЕ НАПИСАНИЯ
В ПРОЦЕССЕ НАПИСАНИЯ
в /etc/profile примерно такой код:
for i in /etc/profile.d/*.sh; do
    . $i # загрузка скрипта в контексте текущего процесса
done


По смыслу правильно было бы разделить 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


Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Проблема: в 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 пришлось отказаться, см.

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



Ссылки