所有 bash 脚本都与 `zsh` 兼容吗?

chr*_*lee 91 bash zsh

我希望从 bash 切换到 zsh,但担心 bash 脚本的兼容性。

所有 bash 脚本/函数都与 zsh 兼容吗?因此,如果这是真的,那么 zsh 只是对 bash 的增强吗?

Huy*_*ens 75

如果您的脚本以该行开头,#!/bin/bash它们仍将使用 bash 运行,即使您的默认 shell 是 zsh。

我发现 zsh 的语法非常接近 bash 的语法,如果真的有一些不兼容,我没有注意。6 年前,我从 bash 无缝切换到 zsh。

  • 对 shell 的路径进行硬编码是不好的建议,即使经常这样做。您应该改用`#!/usr/bin/env bash`,*尤其* 在 macOS 上,默认 bash 严重过时并且新版本几乎总是安装在不同的路径中。 (15认同)
  • 没有任何。我的个人脚本添加了对 bash 的正确引用,并且我找到了一个很好的 .zshrc 开始。Zsh 和 bash 非常相似,我并不觉得它具有挑战性。 (4认同)
  • 你能列出你的`.zshrc` :) (4认同)

Gil*_*il' 42

如果您将 Zsh 置于正确的仿真模式(emulate shemulate 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 设置,所以你不需要把这一行放在内部函数中,只需要在最终用户调用的函数中。

  • 你使用的 shell 是无关紧要的*如果*你以`./my_script.sh` 运行你的脚本。`source my_script.sh` 和 `. my_script.sh` 将作为当前 shell 运行它,忽略任何 shebang。 (8认同)
  • @rrr 不。`./test.sh` 将 `test.sh` 作为一个单独的程序运行。采购将是`。./test.sh`,因此在同一进程内或多或少地像函数调用一样运行文件的内容。 (2认同)

ImH*_*ere 8

如果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 有许多(很多)扩展,可以更轻松地交互工作。这同时也是一个很好的切换理由和一个问题:

  1. 专业版

    • 能够看到按选项卡的命令语法选项非常好。
    • zsh 的另一个主要好处是在您输入错误时进行错误纠正。zsh 不仅会显示 error: command not found,还会尝试解释您尝试输入的内容。zsh 将接受此输入作为有效命令。
    • 此外,zsh 具有许多扩展修饰符,可以提供多种解决方案。像:只列出文件:(ls *(.)这对于其他 shell 来说很困难)。即使深入研究,答案在 zsh( print -rl -- *(/)) 中也变得复杂
    • 接受带有浮点数的数学(有一些警告)。
  2. 配置:

    • Bash 是更多系统中的默认 shell。
    • 许多 zsh 选项并不能直接帮助编写与 bash 兼容的脚本。
    • 尝试同时学习两个 shell 甚至可能成为一个大问题。

最后,是你的选择,而且,我总是喜欢更多的选择。