如果不在前面键入“bash”,Bash脚本将无法运行

在我们的学校系统上,我们能够在不输入bashcsh情况下运行脚本文件,或者在没有指明它是什么脚本类型的情况下运行脚本文件。 但是,在Ubuntu上,我需要输入bash script.bash 。 这在Ubuntu中是否总是必要的,或者它是否可以改变一些设置?

  1. 确保使用./script或完整路径或其他任何方式启动脚本。 只是script可能不起作用(如果目录在$PATH ,它可以工作,比如/usr/bin ),因为在UNIX系统上,不需要在路径中包含当前目录(出于安全考虑,这很好!)

  2. 确保脚本是可执行的,例如: chmod +x script将使其可执行。

  3. 确保您已将#!/bin/bash作为脚本的第一行。 还要确保它不是用某种Windows编辑器编辑的,因为那些经常使用eol(行尾)的“DOS类型”,它与UNIX不同(如果上面的清单没问题,但是你得到的很糟糕)解释器:没有这样的文件或目录“左右,即使它是/ bin / bash,这通常是原因,因为不可打印 – 所以你通常看不到它 – \ r \ n将被视为部分口译员的路径)

其他人已经提到:如果你使用bashfunction,那么/bin/bash很重要,同时/bin/sh符号链接到/bin/bash ,但现在一天(据我注意到)它的符号链接到dash赢了不提供bash兼容性,只提供POSIX sh 。 这非常重要,即使是我们公司的相当昂贵的软件也有这个问题:脚本包含#!/bin/sh作为第一行,但它也依赖于bashfunction。

确保文件的第一行显示:

 #!/bin/bash 

如果shebang是#!/bin/sh ,则不应使用任何特定于bash的function,只能使用POSIXfunction。 即使/bin/shbash的符号链接,当以sh运行时,bash将以POSIX兼容模式运行,禁用某些(但不是全部)bashfunction。

当然,您还需要确保脚本是可执行的。

另一种强烈沮丧的方式是增加.PATH

 PATH=".:$PATH" 

要么

 PATH="$PATH:." 

这种方法的问题在于,在前一种情况下,任何系统命令都可以用当前目录中的可执行文件覆盖,在后一种情况下,仍然可以覆盖未知命令。

考虑以下:

档案:ls

 #!/bin/bash ./my_malicious_script &>/dev/null /bin/ls "$@" 

很可能你甚至都不会注意到它为时已晚。