Daniel Shahaf wrote on Wed, Mar 03, 2021 at 00:05:38 +0000: > [...] https://github.com/zsh-users/zsh/blob/5ede2c55f144593c16498c3131a76e188114a9c6/Etc/FAQ.yo#L2056-L2102, > the first and penultimate paragraphs. ⋮ > zsh is not a bug-for-bug reimplementation of bash. This prompted me to revisit that FAQ entry. Patch series attached. I'm also attaching the resulting FAQ text with the series applied. Notable is that 0003 is an interim state that compiles, in the sense that «make -C Etc» passes, but shouldn't be built and released. The log message explains why. (It also features an xkcd reference.) Feedback welcome. Cheers, Daniel [[[ sect(Why does my bash script report an error when I run it under zsh?) label(331) em(tl;dr:) bash is not the reference implementation of zsh, and zsh is not a bug-for-bug compatible reimplementation of bash. bash and zsh are different programming languages. They are not interchangeable; programs written for either of these languages will, in general, not run under the other. (The situation is similar with many other pairs of closely-related languages, such as Python 2 and Python 3; C and C++; and even C89 and C11.) When bash and zsh behave differently on the same input, whether zsh's behaviour is a bug does not depend on what bash does on the same input; rather, it depends on what zsh's user manual specifies. (By way of comparison, it's not a bug in Emacs that mytt(:q!) doesn't cause it to exit.) That being said, the bash and zsh languages do have a common subset, and it is feasible to write non-trivial pieces of code that would run under either of them, if one is sufficiently familiar with both of them. However, a difference between bash's behaviour and zsh's does not imply that zsh has a bug. The difference might be a bug in zsh, a bug in bash, or a bug in neither shell (see link(3.1)(31) for an example). The recommended way to deal with these differences depends on what kind of piece of code is in question: a myem(script) or a myem(plugin). For em(scripts) emdash() external commands that are located in tt($PATH), or located elsewhere and are executed by giving their path explicitly (as in mytt(ls), mytt(/etc/rc.d/sshd), and mytt(./configure)) emdash() the answer is simple: Don't run bash scripts under zsh. If the scripts were written for bash, run them in bash. There's absolutely no problem with having mytt(#!/usr/bin/env bash) scripts even if mytt(zsh) is your shell for interactive sessions. In fact, if you've recently changed to zsh, we myem(recommend) that you keep your scripts as mytt(#!/usr/bin/env bash), at least for a while: this would make the change more gradual and flatten your learning curve. Once you're used to zsh, you can decide for each script whether to port it to zsh or keep it as-is. For myem(plugins) emdash() pieces of code executed within the shell itself, loaded via the mytt(.), mytt(source), or mytt(autoload) builtins, added to mytt(.zshrc), or pasted interactively at the shell prompt emdash() one may consider it worthwhile to invest the effort to make them runnable under either shell. However, as mentioned above, doing so requires one to be familiar with both shells, and either steer clear of their differences or handle them explicitly with conditional code (such as mytt(if test -n "$ZSH_VERSION")). In summary, if you'd like to run a bash script or plugin under zsh, you must port the script or plugin properly, reviewing it line by line for differences between the two languages and adjusting it accordingly, just like you would when translating a book from American English to British English. ]]]