DotFiles/Shells/Zsh/mc alias

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

(Различия между версиями)
Перейти к: навигация, поиск
Строка 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
-
 

Версия 18: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



Ссылки


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