使用 "sh script.sh" 或 "./script.sh" 运行 shell 脚本会产生两种不同的结果?



我无法理解我的 Ubuntu unix 环境如何处理脚本执行。我写了以下 bash 脚本(称为 script.sh )来表示我的困惑:

#!/usr/bin/env bash
if [ $1 == "yes" ]; then
    echo -ne "Caughtn"
fi
if [ $1 != "yes" ]; then
    echo -ne "Not Caughtn"
fi

当我使用 sh script.sh yes 执行此脚本时,我得到以下输出:

`tester.sh: 2: [: yes: unexpected operator`

但是,当我使用 chmod 775 script.sh 使脚本可执行,然后使用命令 ./script.sh yes 时,我得到了适当的输出 Caught

有人可以告诉我我做错了什么吗?无论我使用 sh 还是 ./ 方法,我都希望脚本正确执行。

感谢您的任何帮助!

sh ...将使用shell而不是bash运行脚本。要使脚本使用 Shabang 中指定的内容,请先使脚本可执行,然后使用 ./script.sh 运行它

你必须使用单个=而不是==这是一种害羞主义,即不是标准的。

因此,当您运行 ./script.sh bash 时,它会解释您的脚本,一切都很好。当你运行sh script.sh不同的程序时,它会这样做(可能是旧的bourne sh,dash甚至伪装bash*)。

我希望脚本正确执行,无论我使用 sh 还是 ./ 方法。

然后不要依赖非便携式功能,例如 == .


  • 通过伪装bash,我的意思是bash关注 argv[0] - 你称之为它的方式 - 并采取相应的行动。如果你称它为sh(也许使用链接),那么它就会尝试像 Bourne shell 一样运行。

相关内容

  • 没有找到相关文章

最新更新