我全新安装了 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 dash
shell 来提供/bin/sh
如下内容:
其他系统(尤其是旧版 Linux 系统)可能会认为这/bin/sh
是由提供的bash
- 这就是您看到错误的原因。虽然我不推荐这样做,但对您问题的字面答案“有没有办法默认将 .sh 文件与 bash 关联起来”见上面的链接我的生产系统坏了,我只想把它恢复正常!IE
sudo dpkg-reconfigure dash
但请注意相关警告:
请注意,这是一个更具侵入性的改变,将会抵消启动速度方面的优势,甚至有可能现在有一些脚本依赖于 bash 不提供的 dash 的某些功能!