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

Материал из ALT Linux Wiki
< DotFiles‎ | Shells‎ | Zsh
Нет описания правки
Нет описания правки
Строка 59: Строка 59:
поддержки mc и других плюшек там нет.
поддержки mc и других плюшек там нет.


В ПРОЦЕССЕ НАПИСАНИЯ
Эту проблему надо решить на дистрибутивном уровне.
 
В fedora, mageia, rosa пошли по пути загрузки {{path|/etc/profile.d/*.sh}} в {{path|/etc/zshrc}}:
for profile_func in /etc/profile.d/*.sh
do
        emulate -R sh -c "source $profile_func"
done
unset profile_func
 
В PLD Linux добавили для таких файлов отдельный каталог {{path|/etc/shrc.d/}},
откуда их должны загружать различные {{path|/etc/*shrc}}:


В ALTLinux тоже предлагалось ввести {{path|/etc/shrc.d/}},
[https://lists.altlinux.org/pipermail/sisyphus/2008-March/329181.html]
[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





Версия от 15:18, 24 октября 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/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/, [1] но, видимо, руки не дошли.


В ПРОЦЕССЕ НАПИСАНИЯ



Ссылки