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


11

在我们的学校系统,我们能够无需键入运行脚本文件bashcsh或者你有什么没有说明什么脚本类型是。但是,在Ubuntu上,我需要输入bash script.bash例如。这在Ubuntu中始终是必需的,还是可以更改的某些设置?


1
设置为可执行文件吗?
jsolarski 2011年

是的,该文件是可执行文件,这就是为什么我认为该文件只能独立运行的原因。
muttley91 2011年

1
键入./script会遇到什么错误?您确定脚本未从Windows编辑器更改,而是在行尾添加了额外的字符?那会打破第一行指出必须使用bash执行脚本。
若奥·平托

1
您如何启动它,错误消息是什么?
用户未知

+1表示不.sh用于bash脚本。但是,通常在UNIX世界中,文件扩展名不用于可执行脚本。
nyuszika7h 2014年

Answers:


17
  1. 确保使用,./script或完整路径或其他内容启动脚本。Just script可能不起作用(如果目录位于$PATH,如/usr/bin,它会起作用),因为在UNIX系统上,将当前目录放在路径中并不是一种习惯(出于安全原因,这很好!)

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

  3. 确保#!/bin/bash脚本中有第一行。还请确保不要使用某种Windows编辑器对其进行编辑,因为它们通常使用eol(行尾)的“ DOS类型”,与UNIX的eol(行尾)不同(如果上面的清单是可以的,但是您得到了“不好”解释器:“没有这样的文件或目录”左右,即使它是/ bin / bash,这也是通常的原因,因为它是不可打印的-所以您通常看不到它-\ r将被视为口译员的路径)

其他人已经提到过:重要的一点是,/bin/bash如果您使用bash功能,并且/bin/sh已经符号链接到它/bin/bash,但是如今(据我所知),它已经符号链接到了dash它,它不提供bash兼容性,仅提供POSIX sh。这很重要,即使我们公司的价格昂贵的软件也存在此问题:脚本包含#!/bin/sh在第一行,但它也依赖于bash功能。


因此,我将不得不像这样运行它:./script,正如我所发现的。这比每次必须键入“ bash”要好,而且这很有意义。我相信我以前就知道这一点,这只是我的想法。哦,很好,谢谢!
muttley91 2011年

从理论上讲,您可以将当前工作目录放入PATH变量中,以便可以仅使用“脚本”代替“ ./script”,但是我警告您:这在UNIX系统上确实不是习惯,并且可能是安全问题!同样,在学校里以一种从来都不是UNIX系统上解决方案的方式学习事物也是不好的,所以我会避免这种解决方案……
LGB

1
或者,最好#!/usr/bin/env bash是,它更便于携带。
Sparhawk

4

确保文件的第一行显示为:

#!/bin/bash

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

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


不,我还是出于习惯将它设置为bash。
muttley91 2011年

0

另一种,极力劝阻方式加入.PATH

PATH=".:$PATH"

要么

PATH="$PATH:."

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

考虑以下:

文件:ls

#!/bin/bash

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

直到为时已晚,您很可能甚至不会注意到。


1
这里的单词选择有些误导。命令不会被覆盖。例如,如果您在当前工作目录中有一个命令恰好与系统目录中的命令同名echo,例如,将使用该目录中的命令,因为该目录是在PATH变量之前设置的/bin。Shell只是根据特定目录中的命令查找命令PATH,而不会覆盖/破坏任何内容。但这是有影响的
Sergiy Kolodyazhnyy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.