我通常使用的外壳是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/profilein /etc/zprofile和source_sh ~/.profilein ~/.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之间不能很好地继承,并且可能需要解决方法。