如果不输入“bash”,Bash 脚本将无法运行

如果不输入“bash”,Bash 脚本将无法运行

在我们的学校系统上,我们可以运行脚本文件而无需键入bashcsh指示脚本类型。但是在 Ubuntu 上,例如,我需要键入bash script.bash。这在 Ubuntu 中是否始终是必要的,还是我可以更改某些设置?

答案1

  1. 确保使用./script或 完整路径 或其他任何方式启动脚本。可能script不起作用(如果目录在 中$PATH,则有效,例如/usr/bin),因为在 UNIX 系统上,不习惯将当前目录放在路径中(出于安全原因,这很好!)

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

  3. 确保#!/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 "$@"

很有可能您直到为时已晚才会注意到。

相关内容