Answers:
如果您的脚本以该行开头#!/bin/bash
,即使您的默认外壳程序为zsh,它们仍将使用bash运行。
我发现zsh的语法非常接近bash的语法,并且如果确实存在一些不兼容性,我也不会注意。6年前,我无缝地从bash切换到zsh。
.zshrc
:)
#!/bin/bash
如果运行脚本文件之类的行将被忽略source ./script.sh
?
#!/usr/bin/env bash
而使用,尤其是在macOS上,在Mac OS中,默认的bash已严重过时,并且实际上总是将新版本安装在不同的路径中。
如果将Zsh置于正确的仿真模式(emulate sh
或emulate ksh
),则Zsh可以运行大多数Bourne,POSIX或ksh88脚本。它不支持bash或ksh93的所有功能。Zsh具有bash的大多数功能,但在许多情况下具有不同的语法。
交互使用的shell与您拥有的任何脚本都不相关。运行脚本的外壳是第一行(shebang行)中指示的外壳。例如,如果脚本以开头#!/bin/bash
,它将由bash执行。
如果您已自定义bash,则无法将自己重命名.bashrc
为.zshrc
。只要您坚持两个壳之间的交集(交集靠近ksh88和pdksh),就可以共享某些东西,例如别名和函数。其他内容,例如提示设置,完成功能和大多数选项,将需要完全重写。
如果您正在编写供人们从.bashrc
或获取信息的代码段,.zshrc
并且不想维护两个版本,请坚持使用bash和zsh功能的公共子集,其中包括bash的大多数编程功能。将整个代码放入函数中,并将以下行放在每个函数的顶部:
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
您可以使用emulate sh
而不是emulate ksh
更接近纯sh语法,这是您需要的.profile
。
如果一个函数调用另一个函数,则另一个函数会继承仿真设置,因此您无需将此行放在内部函数中,只需在最终用户调用的函数中。
./my_script.sh
。source my_script.sh
并将. my_script.sh
其作为当前shell运行,而忽略任何shebang。
如果shebang是#!/bin/bash
并且您启动了脚本,因为./script
该脚本将由bash执行。这里绝对没有问题。
但是,如果将其执行zsh ./script
或提供. ./script
给正在运行的zsh实例,则bash和zsh的语法不匹配是很常见的。
例如,zsh默认情况下不会拆分参数扩展,bash具有内置帮助,read -p prompt
zsh中没有(语法在zsh中完全不同,read cmd \?prompt , arrays start on 1 (not 0) in zsh,
命令only search for external commands in zsh, or there is no (simple) equivalent to
$ {foo ^}`(大写仅第一个字符)这是一长串(主要是)相似之处和不同之处。
在某些情况下,可能会告诉zsh模拟其他shell。在某些情况下,可能没有通用的语法可移植到两个shell(无需使用别名或函数来模拟可移植的解决方案)。
但是,zsh具有许多(很多)扩展,这些扩展使交互工作更容易。同时,这是切换的绝佳理由,也是一个问题:
ls *(.)
其他shell很难做到)。即使足够深入地看,答案在zsh(print -rl -- *(/)
)中也变得复杂。Con zsh:
最后,这是您的选择,而且我一直喜欢更多选择。