我通常使用的外壳是zsh
。我有一些别名,可以在ls
和程序中启用颜色grep
。我还设置了自定义路径,以便可以在非标准位置(例如在中~/bin/
)执行程序。
我不会将root的shell更改为zsh
,但是我想共享这些设置,以便root也可以拥有它。我发现这zsh
不是采购/etc/profile
。我可以在中获取它/etc/zsh/zprofile
,但我想使用其他更“适当”的方式。
我通常使用的外壳是zsh
。我有一些别名,可以在ls
和程序中启用颜色grep
。我还设置了自定义路径,以便可以在非标准位置(例如在中~/bin/
)执行程序。
我不会将root的shell更改为zsh
,但是我想共享这些设置,以便root也可以拥有它。我发现这zsh
不是采购/etc/profile
。我可以在中获取它/etc/zsh/zprofile
,但我想使用其他更“适当”的方式。
Answers:
我将创建一个文件/etc/commonprofile
,并在/etc/profile
和中将其作为源/etc/zsh/zprofile
。这使您可以分享共同的设置,并且仍然使用的机会,bash
分别zsh
在特定环境和语法/etc/profile
分别zprofile
。
Zsh具有sh兼容模式,这将使其执行POSIX sh代码和一些bash扩展。只要您不使用zsh不具备的bash功能(具有相同的语法),就可以使两个shell都具有相同的文件。使用emulate
内置将zsh置于兼容模式;如果使用该-L
选项,则该仿真对于封装函数是本地的(不是封装源脚本)。
source_sh () {
emulate -LR sh
. "$@"
}
对于环境变量之类的东西,可以使用source_sh /etc/profile
in /etc/zprofile
和source_sh ~/.profile
in ~/.zprofile
,因为配置文件不太可能使用bash特定的功能。
对于诸如别名和函数定义之类的内容,由于shell rc文件可能包含许多无法共享的内容(提示,键绑定,完成设置等),因此请使用~/.sh_aliases
源于~/.bashrc
和source_sh
'd的文件在~/.zshrc
。
一个简单的符号链接呢?
ln -s /etc/profile /etc/zsh/zprofile
如果需要一些条件初始化,也可以添加以下内容:
#Determine our shell without using $SHELL, which may lie
shell="sh"
if test -f /proc/mounts; then
case $(/bin/ls -l /proc/$$/exe) in
*bash) shell=bash ;;
*dash) shell=dash ;;
*ash) shell=ash ;;
*ksh) shell=ksh ;;
*zsh) shell=zsh ;;
esac
fi
/bin/ls -l /proc/$$/exe
是ps -o comm= -p $$
。这不是完全可靠的,因为某些shell的行为取决于调用它们的方式。在实践中只检查$0
的.profile
很可能是一个更好的指标。但是,提供有用的功能(的bash和ksh,zsh中)最弹可识别出来,只要(及其版本鉴定,这是一大利好)通过测试一些变量:$BASH
,$BASH_VERSION
,$BASH_VERSINFO
,$KSH_VERSION
,${.sh.version}
; $ZSH_VERSION
。
关于变量,我的印象是您缺少模块和模块文件[1]。一旦开始这样做,就可以通过单个模块文件方便地为各种shell(包括bash和zsh),python,perl甚至更多环境创建通用配置文件。
也可以用相同的方式定义别名。但是,您会很快发现别名在连续的Shell之间不能很好地继承,并且可能需要解决方法。