更改运行 .sh 文件的默认 shell

更改运行 .sh 文件的默认 shell

我全新安装了 Ubuntu 18.04。我在文件中运行了不少安装脚本.sh。我注意到,如果我简单地运行./my_script.sh,它们就会报告,[[: not found除非我明确指定bash ./my_script.sh。谷歌搜索表明默认值相当于sh ./my_script.sh,这就是发生这种情况的原因。

现在我有一堆别人编写的脚本,假设我使用bash并调用了相当多的.sh文件。我可以进入脚本并bash在它们前面明确添加;但是有没有办法.sh默认将文件与 bash 关联?

echo $0注意:我已经在使用 bash - 我可以看到is的结果bash

肖恩

答案1

在脚本的第一行添加舍邦行用于解释器。这样,您就不必在运行脚本之前指定 shell。

例子:

添加bash

#!/bin/bash

添加sh

#!/bin/sh

ETC。

Linux 会忽略文件扩展名来告诉内核文件的类型。最好将其添加为脚本的第一行来告诉内核文件的类型。作为测试,这里是同一个文件,但第一行使用不同的解释器。

~$ file a.txt
a.txt: ASCII text
~$ cat a.txt

11
22
33
44
55
11

现在我将添加如上所述的 shebang 行作为该文件的第一行,然后再次运行测试:

~$ file a.txt
a.txt: Bourne-Again shell script, ASCII text executable
~$ cat a.txt
#!/bin/bash
11
22
33
44
55
11

希望这可以帮助!

答案2

正如其他答案所解释的那样,您下载的文件不是通过其.sh扩展名与特定的 shell 解释器相关联的,而是通过其#!/bin/sh“shebang”相关联的。

从早期开始,Ubuntu 就使用 Almquist dashshell 来提供/bin/sh如下内容:

其他系统(尤其是旧版 Linux 系统)可能会认为这/bin/sh是由提供的bash- 这就是您看到错误的原因。虽然我不推荐这样做,但对您问题的字面答案“有没有办法默认将 .sh 文件与 bash 关联起来”见上面的链接我的生产系统坏了,我只想把它恢复正常!IE

sudo dpkg-reconfigure dash

但请注意相关警告:

请注意,这是一个更具侵入性的改变,将会抵消启动速度方面的优势,甚至有可能现在有一些脚本依赖于 bash 不提供的 dash 的某些功能!

相关内容