如果不在前面键入“bash”,Bash脚本将无法运行
在我们的学校系统上,我们能够在不输入bash
或csh
情况下运行脚本文件,或者在没有指明它是什么脚本类型的情况下运行脚本文件。 但是,在Ubuntu上,我需要输入bash script.bash
。 这在Ubuntu中是否总是必要的,或者它是否可以改变一些设置?
-
确保使用
./script
或完整路径或其他任何方式启动脚本。 只是script
可能不起作用(如果目录在$PATH
,它可以工作,比如/usr/bin
),因为在UNIX系统上,不需要在路径中包含当前目录(出于安全考虑,这很好!) -
确保脚本是可执行的,例如:
chmod +x script
将使其可执行。 -
确保您已将
#!/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/sh
是bash
的符号链接,当以sh运行时,bash将以POSIX兼容模式运行,禁用某些(但不是全部)bashfunction。
当然,您还需要确保脚本是可执行的。
另一种强烈沮丧的方式是增加.
对PATH
。
PATH=".:$PATH"
要么
PATH="$PATH:."
这种方法的问题在于,在前一种情况下,任何系统命令都可以用当前目录中的可执行文件覆盖,在后一种情况下,仍然可以覆盖未知命令。
考虑以下:
档案:ls
#!/bin/bash ./my_malicious_script &>/dev/null /bin/ls "$@"
很可能你甚至都不会注意到它为时已晚。