加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash脚本不能与`sh`一起使用

发布时间:2020-12-15 18:30:03 所属栏目:安全 来源:网络整理
导读:我正在测试一个简单的脚本,我想知道为什么它在从目录执行时工作正常:./ test.sh但是当我尝试使用“sh”命令sh test.sh时它不起作用: test.sh: 3: test.sh: [[: not foundtest.sh: 7: test.sh: [[: not found 脚本: #!/usr/bin/env bashif [[ $1 = one ]]
我正在测试一个简单的脚本,我想知道为什么它在从目录执行时工作正常:./ test.sh但是当我尝试使用“sh”命令sh test.sh时它不起作用:
test.sh: 3: test.sh: [[: not found
test.sh: 7: test.sh: [[: not found

脚本:

#!/usr/bin/env bash

if [[ $1 = one ]]
        then
        printf "%b" "twon" >&2
        exit 0
elif [[ $1 = two ]]
then
        printf "%b" "onen" >&2
        exit 0
else
        printf "%b" "Specify argument: one/twon"
        exit 1
fi
摘要

sh是一个与bash不同的程序.

详情

问题是Bourne shell(sh)不是Bourne Again shell(bash).即,sh不理解[[pragma.事实上,它也不理解[也是如此. [是/ bin / test(或/usr/bin/[,/usr/bin/test)的实际程序或链接.

$which [
/bin/[
$ls -lh /bin/[
-r-xr-xr-x  2 root  wheel    42K Feb 29 17:11 /bin/[

当您通过./test.sh直接执行脚本时,您将调用脚本作为第一行中指定的程序的第一个参数.在这种情况下:

#!/usr/bin/env bash

通常,这是直接解释器(/ bin / bash,或任何数量的其他脚本解释器),但在您的情况下,您使用env在修改后的环境中运行程序 – 但是后面的参数仍然是bash.实际上,./ test.sh是bash test.sh.

因为sh和bash是具有不同语法解释的不同shell,所以您会看到该错误.如果你运行bash test.sh,你应该看到预期的结果.

更多信息

其他人在评论中指出/ bin / sh可以是链接或其他shell.从历史上看,sh是旧AT& T Unix上的Bourne shell,在我看来是规范下降.然而,这在BSD变化中是不同的,并且随着时间的推移在其他基于Unix的系统和分布中有所不同.如果你真的对内部工作感兴趣(包括/ bin / sh和/ bin / bash如何是同一个程序并且表现完全不同),请阅读以下内容:

SuperUser: What is the difference between bash and sh

Wikipedia: Bourne shell

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读