我希望从 bash 切换到 zsh,但担心 bash 脚本的兼容性。
所有 bash 脚本/函数都与 zsh 兼容吗?因此,如果这是真的,那么 zsh 只是对 bash 的增强吗?
Huy*_*ens 75
如果您的脚本以该行开头,#!/bin/bash它们仍将使用 bash 运行,即使您的默认 shell 是 zsh。
我发现 zsh 的语法非常接近 bash 的语法,如果真的有一些不兼容,我没有注意。6 年前,我从 bash 无缝切换到 zsh。
Gil*_*il' 42
如果您将 Zsh 置于正确的仿真模式(emulate sh或emulate ksh),则它可以运行大多数 Bourne、POSIX 或 ksh88 脚本。它不支持 bash 或 ksh93 的所有功能。Zsh 具有 bash 的大部分功能,但在许多情况下具有不同的语法。
您交互使用的 shell 与您拥有的任何脚本无关。运行脚本的shell 是第一行shebang行中指示的shell 。例如,如果脚本以 开头#!/bin/bash,它将被 bash 执行。
如果您自定义了 bash,您将无法将您的 .bash 重命名.bashrc为.zshrc. 有些东西可以共享,例如别名和函数,只要你坚持两个 shell 之间的交集(交集接近 ksh88 和pdksh)。其他的东西,比如提示设置、完成功能和大多数选项,都需要完全重写。
如果您正在编写一个片段供人们从他们的.bashrcor 中获取源代码,.zshrc并且您不想维护两个版本,请坚持使用 bash 和 zsh 功能的公共子集,其中包括 bash 的大部分编程功能。将整个代码放在函数中,并将以下行放在每个函数的顶部:
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
Run Code Online (Sandbox Code Playgroud)
您可以使用emulate sh而不是emulate ksh更接近普通的 sh 语法,这正是您需要的.profile.
如果一个函数调用另一个函数,另一个函数会继承 emulate 设置,所以你不需要把这一行放在内部函数中,只需要在最终用户调用的函数中。
如果shebang是#!/bin/bash并且您启动脚本,因为./script脚本将由bash执行。这里绝对没有问题。
但是,如果您执行zsh ./script它或将其提供. ./script给正在运行的 zsh 实例,那么 bash 和 zsh 的语法不匹配是很常见的。
比如zsh默认不拆分参数扩展,bash内置了help,read -p promptzsh中没有(语法很不一样 read cmd\?prompt , arrays start on 1 (not 0) in zsh,command only search for external commands in zsh, or there is no (simple) equivalent to${foo^}` (uppercase only first character) in zsh等等。这是一长串(主要是)相似之处和一些不同之处。
在某些情况下,可能会告诉 zsh 模拟其他 shell。在某些情况下,没有可移植到两个 shell 的通用语法(不使用别名或函数来模拟可移植解决方案)。
但是,zsh 有许多(很多)扩展,可以更轻松地交互工作。这同时也是一个很好的切换理由和一个问题:
ls *(.)这对于其他 shell 来说很困难)。即使深入研究,答案在 zsh( print -rl -- *(/)) 中也变得复杂。配置:
最后,是你的选择,而且,我总是喜欢更多的选择。