我通常使用的外壳是zsh
.我有几个别名可以在某些程序中启用颜色,例如ls
和grep
。我还设置了自定义路径,以便我可以在非标准位置(例如在~/bin/
)中执行程序。
我不会改变 root 的 shell到zsh
,但我想分享这些设置,以便 root 也可以拥有它。我发现这zsh
不是采购/etc/profile
。我可以将其来源/etc/zsh/zprofile
,但我想要其他更“正确”的方式。
答案1
我会创建一个文件并在和/etc/commonprofile
中获取它。这使您有机会共享通用设置,并且仍然分别使用特定的设置和语法。/etc/profile
/etc/zsh/zprofile
bash
zsh
/etc/profile
zprofile
答案2
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
。
答案3
一个简单的符号链接怎么样?
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
答案4
至于变量,我的印象是您缺少模块和模块文件 [1]。一旦开始这样做,就可以轻松地为各种 shell(包括 bash 和 zsh)、python、perl 甚至更多环境创建通用配置文件,所有这些都可以通过单个模块文件的便利性实现。
也可以用同样的方式定义别名;但是,您很快就会发现别名在连续的 shell 之间不能很好地继承,并且可能需要解决方法。