bash - 运行 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
解决方案
.
并不意味着“用”运行这个文件bash
。这意味着执行当前shell中的内容。
此外,与in不同,[
内置 in不接受作为字符串比较运算符。你必须使用. (顺便说一句,您也应该使用in以避免混淆。)如果您想使用,请改用。zsh
bash
==
=
[ ... = ... ]
bash
==
[[ "$SOURCED" == "0" ]]
仅当您将脚本作为命令本身执行时才使用 shebang,例如./test.sh
or/some/absolute/path/to/test.sh
或test.sh
(如果test.sh
在您的目录中PATH
)。
无论出于何种历史原因,都选择了命令名称,尽管可能与当前目录的名称(vs vs ).
混淆。尽管 POSIX 不需要更易读的同义词,但大多数现代 shell 都提供(接近)等价物。(因为它不是标准的,但是, 的行为可能因外壳而异。我相信和在 中是等价的,但是在两者之间查找其参数时存在细微差别。).
. test.sh
./test.sh
. ./test.sh
source
source
.
source
bash
PATH
zsh
推荐阅读
- uml - 如何正确绘制具有访问限制的用例图?
- sql - SQL Server:使用 CTE 行分区序列化顺序时间戳
- r - 如何在单个图上为随机福雷斯特、决策树和逻辑回归绘制 ROC 曲线
- node.js - 在 aws lambda nodejs 函数中获取音频持续时间
- sass - 为什么我的小图像是全屏宽度,即使我的 scss 文件中没有标记表明如此?
- proof - 证明数据类型之间转换的正确性
- sql - Sql Performance join Vs co-related Subquery
- paypal - 我怎样才能捕获更多的自动量
- unity3d - 在 Unity 中提取 DJI 无人机参数到 XYZ 位置
- node.js - 通过 insertTime ( new Date().getTime() ) 在 mongoDB (mongoose) 上查找最后 5 个插入的文档