Answers:
我怀疑您的“ shebang”行(文件的可选第一行)正在引用sh而不是bash。它应该是
#!/bin/bash
用于bash脚本。如果脚本的第一行是
#!/bin/sh
则表明将使用严格的本恩兼容外壳;如果是Ubuntu,dash则使用。在许多其他发行版中,这不会引起问题,因为它们链接/bin/sh到/bin/bash;。但是,ubuntu链接到/bin/dash该链接以允许系统脚本更快地运行。
该declare内置是一个bash的许多扩展到Bourne shell脚本规范; dash只是实现该规范而没有扩展。
#!/bin/bash唯一的
sh thescript.sh,则sh外壳程序dash即将对其进行解释。
sh script.sh。我理解您的意思,但是我在某处已经读到这种方法bash可以解释它。为什么要dash在这里扮演角色?仅适用于Ubuntu吗?大概是我读到的关于linux的内容。
sh script您一起运行sh带有参数的命令script,这使sh可以读取并执行该文件中的命令。sh不会读取shebang,它以开头#,因此被视为注释。如果您改为运行./script,则内核将读取shebang,在您的情况下为shebang,#!/bin/bash因此它将执行/bin/bash ./script
dash将使用@intuited提及,所以我需要澄清一下
在Ubuntu上,您可能有一个脚本正在执行其中的其他脚本,而我已经遇到了该脚本。
some_dir/
| main.sh
| shhh.sh
#!/bin/bash -e
echo "file? $0"
# file? ./main.sh
echo "shell? $SHELL"
# shell? /bin/bash
# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found
$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar
#!/bin/bash -e
echo "file? $0"
# shhh.sh
echo "shell? $SHELL"
# shell? /bin/bash
declare foo="bar"
echo "foo? $foo"
全部更改sh some_script.sh以$SHELL some_script.sh修复它。
#!/bin/bash。你是说我怎么执行吗?我只是尝试按原样执行它,./script.sh而且效果很好。但是它不能像script.shor 那样工作sh script.sh,我可以肯定的是,我一周前创建它时只使用了后两种方法。有什么可以解释的?