首页 > 解决方案 > 运行 bash 脚本,zsh 的结果与 bash 不同,即使脚本有 bash shebanged

问题描述

我有以下脚本,test.sh如果我从 bash 调用它,它可以工作,但如果我从 bash 调用它zsh,则不会,即使它在顶部有一个 bash shebang

如果我从 zsh 调用它,我会收到以下错误。有谁知道为什么?

$ . scripts/test.sh
scripts/test.sh:14: = not found

它抱怨的行是:

if [ "$SOURCED" == "0" ]

测试.sh

#!/usr/bin/env bash
(return 0 2>/dev/null) && SOURCED=1 || SOURCED=0

function showHelp(){
  local ME;
  ME=$(basename "$0")
  echo
  echo "This command needs to be run like so:"
  echo "$ . $ME "
  echo
}

# exit if not sourced or called from another script
if [ "$SOURCED" == "0" ]
then
  if [ -z "$1" ]
  then
    showHelp
    exit;
  fi
fi

标签: bashzsh

解决方案


.并不意味着“用”运行这个文件bash。这意味着执行当前shell中的内容。

此外,与in不同,[内置 in不接受作为字符串比较运算符。你必须使用. (顺便说一句,您也应该使用in以避免混淆。)如果您想使用,请改用。zshbash===[ ... = ... ]bash==[[ "$SOURCED" == "0" ]]

仅当您将脚本作为命令本身执行时才使用 shebang,例如./test.shor/some/absolute/path/to/test.shtest.sh(如果test.sh在您的目录中PATH)。

无论出于何种历史原因,都选择了命令名称,尽管可能与当前目录的名称(vs vs ).混淆。尽管 POSIX 不需要更易读的同义词,但大多数现代 shell 都提供(接近)等价物。(因为它不是标准的,但是, 的行为可能因外壳而异。我相信和在 中是等价的,但是在两者之间查找其参数时存在细微差别。).. test.sh./test.sh. ./test.shsourcesource.sourcebashPATHzsh


推荐阅读