在 zsh 和 bash 之间共享别名和 PATH 设置

在 zsh 和 bash 之间共享别名和 PATH 设置

我通常使用的外壳是zsh.我有几个别名可以在某些程序中启用颜色,例如lsgrep。我还设置了自定义路径,以便我可以在非标准位置(例如在~/bin/)中执行程序。

不会改变 root 的 shellzsh,但我想分享这些设置,以便 root 也可以拥有它。我发现这zsh不是采购/etc/profile。我可以将其来源/etc/zsh/zprofile,但我想要其他更“正确”的方式。

答案1

我会创建一个文件并在和/etc/commonprofile中获取它。这使您有机会共享通用设置,并且仍然分别使用特定的设置和语法。/etc/profile/etc/zsh/zprofilebashzsh/etc/profilezprofile

答案2

Zsh 有一个 sh 兼容模式,可以让它执行 POSIX sh 代码和一些 bash 扩展。只要您不使用 zsh 没有的 bash 功能(具有相同的语法),您就可以拥有两个 shell 所提供的相同文件。使用emulate内置将 zsh 置于兼容模式;使用该-L选项,模拟是封闭函数(而不是封闭源脚本)的本地模拟。

source_sh () {
  emulate -LR sh
  . "$@"
}

对于环境变量之类的内容,您可以使用source_sh /etc/profilein/etc/zprofilesource_sh ~/.profilein ~/.zprofile,因为配置文件不太可能使用 bash 特定的功能。

对于别名和函数定义之类的内容,由于 shell rc 文件可能包含许多无法共享的内容(提示符、键绑定、完成设置等),因此请使用~/.sh_aliases源自~/.bashrcsource_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 之间不能很好地继承,并且可能需要解决方法。

[1]http://en.wikipedia.org/wiki/Environment_Modules_(软件)

相关内容