如何在Unix控制台或Mac终端上运行shell脚本?

我知道它,忘记它并重新学习它。 有时间写下来。


要运行不可执行的sh脚本,请使用:

sh myscript

要运行不可执行的bash脚本,请使用:

bash myscript

启动一个可执行文件(这是任何具有可执行权限的文件); 你只需通过它的路径指定它:

/foo/bar
/bin/bar
./bar

要使脚本可执行,请为其提供必要的权限:

chmod +x bar
./bar

当文件可执行时, 内核负责确定如何执行它。 对于非二进制文件,这是通过查看文件的第一行来完成的。 它应该包含一个hashbang

#! /usr/bin/env bash

hashbang告诉内核运行哪个程序(在这种情况下,命令/usr/bin/env是使用参数bash )。 然后,将脚本作为后续参数传递给程序(作为第二个参数)以及您将脚本作为后续参数的所有参数。

这意味着每个可执行的脚本都应该有一个hashbang 。 如果没有,你不会告诉内核它是什么,因此内核不知道用什么程序来解释它。 它可能是bashperlpythonsh或其他东西。 (实际上,内核通常使用用户的默认shell来解释文件,这是非常危险的,因为它可能根本不是正确的解释器,或者它可能能够解析其中的一些文件,但是具有微妙的行为差异,例如shbash之间的情况)。

关于/usr/bin/env

最常见的情况是,你会看到像这样的哈希爆炸声:

#!/bin/bash

其结果是内核将运行程序/bin/bash来解释脚本。 不幸的是, bash并不总是默认发货,并且它并不总是在/bin可用。 虽然在Linux机器上通常是,还有其它POSIX机器的范围,其中bash一般在不同的位置,如/usr/xpg/bin/bash/usr/local/bin/bash

为了编写一个可移植的bash脚本,我们不能依赖对bash程序的位置进行硬编码。 POSIX已经有了一个处理这个问题的机制: PATH 。 这个想法是,您将程序安装在PATH中的某个目录中,并且系统应该能够在按名称运行时找到您的程序。

可悲的是,你不能这样做:

#!bash

内核不会(有些可能)为您执行PATH搜索。 有一个程序可以为你做一个PATH搜索,但是,它被称为env 。 幸运的是,几乎所有的系统都在/usr/bin安装了一个env程序。 因此,我们使用硬编码路径启动env ,然后执行PATH搜索bash并运行它,以便它可以解释您的脚本:

#!/usr/bin/env bash

这种方法有一个缺点:根据POSIX,hashbang可以有一个参数 。 在这种情况下,我们使用bash作为env程序的参数。 这意味着我们没有空间将参数传递给bash 。 所以没有办法将#!/bin/bash -exu这样的东西转换成这个方案。 您必须在set -exu之后放置set -exu

这种方法还有另外一个优点:有些系统可能会附带/bin/bash ,但用户可能不喜欢它,可能会发现它有问题或过时,并且可能在其他地方安装了自己的bash 。 在OS X(Mac)上,苹果发布过时/bin/bash并且用户使用Homebrew等安装最新的/usr/local/bin/bash的情况经常出现这种情况。 当您使用执行PATH搜索的env方法时,您会考虑用户的偏好,并在他的系统附带的系统上使用他偏好的bash。


启动shell脚本'file.sh':

sh file.sh

bash file.sh

另一个选项是使用chmod命令设置可执行权限:

chmod +x file.sh

现在运行.sh文件如下:

./file.sh

对于bourne shell:

sh myscript.sh

对于bash:

bash myscript.sh
链接地址: http://www.djcxy.com/p/36187.html

上一篇: How to run a shell script on a Unix console or Mac terminal?

下一篇: Unix shell script find out which directory the script file resides?