在我们的学校系统,我们能够无需键入运行脚本文件bash或csh或者你有什么没有说明什么脚本类型是。但是,在Ubuntu上,我需要输入bash script.bash例如。这在Ubuntu中始终是必需的,还是可以更改的某些设置?
.sh用于bash脚本。但是,通常在UNIX世界中,文件扩展名不用于可执行脚本。
在我们的学校系统,我们能够无需键入运行脚本文件bash或csh或者你有什么没有说明什么脚本类型是。但是,在Ubuntu上,我需要输入bash script.bash例如。这在Ubuntu中始终是必需的,还是可以更改的某些设置?
.sh用于bash脚本。但是,通常在UNIX世界中,文件扩展名不用于可执行脚本。
Answers:
确保使用,./script或完整路径或其他内容启动脚本。Just script可能不起作用(如果目录位于$PATH,如/usr/bin,它会起作用),因为在UNIX系统上,将当前目录放在路径中并不是一种习惯(出于安全原因,这很好!)
确保脚本是可执行的,例如:chmod +x script将使其可执行。
确保#!/bin/bash脚本中有第一行。还请确保不要使用某种Windows编辑器对其进行编辑,因为它们通常使用eol(行尾)的“ DOS类型”,与UNIX的eol(行尾)不同(如果上面的清单是可以的,但是您得到了“不好”解释器:“没有这样的文件或目录”左右,即使它是/ bin / bash,这也是通常的原因,因为它是不可打印的-所以您通常看不到它-\ r将被视为口译员的路径)
其他人已经提到过:重要的一点是,/bin/bash如果您使用bash功能,并且/bin/sh已经符号链接到它/bin/bash,但是如今(据我所知),它已经符号链接到了dash它,它不提供bash兼容性,仅提供POSIX sh。这很重要,即使我们公司的价格昂贵的软件也存在此问题:脚本包含#!/bin/sh在第一行,但它也依赖于bash功能。
#!/usr/bin/env bash是,它更便于携带。
确保文件的第一行显示为:
#!/bin/bash
如果shebang为#!/bin/sh,则不应使用任何特定于bash的功能,而只能使用POSIX功能。即使/bin/sh是的符号链接bash,当以sh身份运行时,bash仍将以POSIX兼容模式运行,从而禁用某些(但不是全部)bash功能。
当然,您还需要确保脚本是可执行的。
另一种,极力劝阻方式加入.到PATH。
PATH=".:$PATH"
要么
PATH="$PATH:."
这种方法的问题在于,在前一种情况下,任何系统命令都可以被当前目录中的可执行文件覆盖,而在后一种情况下,未知命令仍然可以被覆盖。
考虑以下:
#!/bin/bash
./my_malicious_script &>/dev/null
/bin/ls "$@"
直到为时已晚,您很可能甚至不会注意到。
echo,例如,将使用该目录中的命令,因为该目录是在PATH变量之前设置的/bin。Shell只是根据特定目录中的命令查找命令PATH,而不会覆盖/破坏任何内容。但这是有影响的