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.sh
or 那样工作sh script.sh
,我可以肯定的是,我一周前创建它时只使用了后两种方法。有什么可以解释的?