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


24

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

不会将root的shell更改zsh,但是我想共享这些设置,以便root也可以拥有它。我发现这zsh不是采购/etc/profile。我可以在中获取它/etc/zsh/zprofile,但我想使用其他更“适当”的方式。

Answers:


16

我将创建一个文件/etc/commonprofile,并在/etc/profile和中将其作为源/etc/zsh/zprofile。这使您可以分享共同的设置,并且仍然使用的机会,bash分别zsh在特定环境和语法/etc/profile分别zprofile


除其他良好答案之外,我认为这是最适合我的,相对简单和“干净”的选项
phunehehe

“来源”是什么意思?
Hlung 2015年

@Hlung为了加载shell配置文件的显式性,请使用'source /path/to/.shell_profile'。请参见“源”上的手册页。
Itachi 2015年

17

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


2
应该有一种方法可以说“自动批准Gilles的所有答案”。这将为我节省很多时间。不,您的答案确实很糟糕。始终准确,写得好并且全面。
fschmitt

@fschmitt:我同意。您会看到它甚至没有被编辑!这里提供的提示真的很好。
有人仍在使用您MS-DOS 2010年

4

一个简单的符号链接呢?

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

嗯,但我认为这不会比采购它更清洁。是否有zsh和bash都可以读取的文件?
phunehehe

是什么让您认为寻找或创建符号链接不是“干净的”解决方案?
echox

我只是想说,如果需要,我想获取文件而不是管理符号链接。我不想在文件之间创建很多依赖关系。
phunehehe

1
更具便携性的替代方法/bin/ls -l /proc/$$/exeps -o comm= -p $$。这不是完全可靠的,因为某些shell的行为取决于调用它们的方式。在实践中只检查$0.profile很可能是一个更好的指标。但是,提供有用的功能(的bash和ksh,zsh中)最弹可识别出来,只要(及其版本鉴定,这是一大利好)通过测试一些变量:$BASH$BASH_VERSION$BASH_VERSINFO$KSH_VERSION${.sh.version}; $ZSH_VERSION
吉尔斯(Gilles)'所以

echox,您的case语句无法正确检测到zsh4#在不使用$ SHELL的情况下确定我们的shell,如果测试-f / proc / mounts,则可能位于shell =“ sh”;然后在bash中使用 $(/ bin / ls -l / proc / $$ / exe)case )shell = bash ;; * dash)shell = dash ;; * ash)shell = ash ;; * ksh)shell = ksh ;; * zsh)shell = zsh ;; #matches zsh4 esac fi
Bryan Hunt

0

关于变量,我的印象是您缺少模块和模块文件[1]。一旦开始这样做,就可以通过单个模块文件方便地为各种shell(包括bash和zsh),python,perl甚至更多环境创建通用配置文件。

也可以用相同的方式定义别名。但是,您会很快发现别名在连续的Shell之间不能很好地继承,并且可能需要解决方法。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.