在我们的学校系统,我们能够无需键入运行脚本文件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
,而不会覆盖/破坏任何内容。但这是有影响的