在我们的学校系统上,我们可以运行脚本文件而无需键入bash
或csh
指示脚本类型。但是在 Ubuntu 上,例如,我需要键入bash script.bash
。这在 Ubuntu 中是否始终是必要的,还是我可以更改某些设置?
答案1
确保使用
./script
或 完整路径 或其他任何方式启动脚本。可能script
不起作用(如果目录在 中$PATH
,则有效,例如/usr/bin
),因为在 UNIX 系统上,不习惯将当前目录放在路径中(出于安全原因,这很好!)确保脚本是可执行的,例如:
chmod +x script
将使其可执行。确保
#!/bin/bash
脚本的第一行是 。还要确保它不是用某种 Windows 编辑器编辑的,因为 Windows 编辑器通常使用 eol(行尾)的“DOS 类型”,这与 UNIX 类型不同(如果上面的检查表没有问题,但您得到了“错误的解释器:没有这样的文件或目录”之类的信息,即使它是 /bin/bash,这通常是原因,因为不可打印 - 所以您通常看不到它 - \r 将被视为解释器路径的一部分)
/bin/bash
其他人已经提到:如果您使用 bash 功能,则重要的是要有,也/bin/sh
已符号链接到/bin/bash
,但现在(据我所知)它已符号链接到,dash
不会提供 bash 兼容性,只有 POSIX sh
。这非常重要,即使我们公司非常昂贵的软件也存在这个问题:脚本包含#!/bin/sh
第一行,但它也依赖于 bash 功能。
答案2
确保文件的第一行内容如下:
#!/bin/bash
如果 shebang 是#!/bin/sh
,则不应使用任何特定于 bash 的功能,而应仅使用 POSIX 功能。即使/bin/sh
是 的符号链接bash
,bash 在以 sh 运行时也会以 POSIX 兼容模式运行,从而禁用部分(但不是全部)bash 功能。
当然,您还需要确保该脚本是可执行的。
答案3
替代,强烈反对方式正在添加.
到PATH
。
PATH=".:$PATH"
或者
PATH="$PATH:."
这种方法的问题在于,在前一种情况下,任何系统命令都可以被当前目录中的可执行文件覆盖,而在后一种情况下,未知命令仍然可以被覆盖。
考虑以下:
文件:ls
#!/bin/bash
./my_malicious_script &>/dev/null
/bin/ls "$@"
很有可能您直到为时已晚才会注意到。