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


Answers:


55

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

我发现zsh的语法非常接近bash的语法,并且如果确实存在一些不兼容性,我也不会注意。6年前,我无缝地从bash切换到zsh。


1
您切换工作中最具挑战性的部分是什么?
chrisjlee 2012年

4
没有。我的个人脚本添加了对bash的正确引用,并且我发现了一个很好的.zshrc开头。Zsh和bash非常相似,以至于我并不觉得它具有挑战性。
惠更斯(Huygens)

4
你能列出你的.zshrc:)
neaumusic

但是,#!/bin/bash如果运行脚本文件之类的行将被忽略source ./script.sh
LCB

3
硬编码外壳程序的路径是一个不好的建议,即使它经常执行也是如此。您应该改#!/usr/bin/env bash而使用,尤其是在macOS上,在Mac OS中,默认的bash已严重过时,并且实际上总是将新版本安装在不同的路径中。
康拉德·鲁道夫

29

如果将Zsh置于正确的仿真模式(emulate shemulate 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

如果一个函数调用另一个函数,则另一个函数会继承仿真设置,因此您无需将此行放在内部函数中,只需在最终用户调用的函数中。


1
如果将脚本运行为,使用的shell无关紧要./my_script.shsource my_script.sh并将. my_script.sh其作为当前shell运行,而忽略任何shebang。
BallpointBen

3

如果shebang是#!/bin/bash并且您启动了脚本,因为./script该脚本将由bash执行。这里绝对没有问题。

但是,如果将其执行zsh ./script或提供. ./script给正在运行的zsh实例,则bash和zsh的语法不匹配是很常见的。

例如,zsh默认情况下不会拆分参数扩展,bash具有内置帮助,read -p promptzsh中没有(语法在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具有许多(很多)扩展,这些扩展使交互工作更容易。同时,这是切换的绝佳理由,也是一个问题:

  1. Pro zsh

    • 很高兴能够看到按选项卡的命令语法选项。
    • zsh的另一个主要优点是您键入错误时可以进行错误纠正。不只是显示错误:找不到命令,zsh还将尝试解释您尝试键入的内容。zsh将接受此输入作为有效命令。
    • 另外,zsh具有许多扩展程序修改器,可以使用多种解决方案。像:仅列出文件:(ls *(.)其他shell很难做到)。即使足够深入地看,答案在zsh(print -rl -- *(/))中也变得复杂
    • 接受带浮点数的数学运算(有一些注意事项)。
  2. Con zsh:

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

最后,这是您的选择,而且我一直喜欢更多选择。

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.