如何在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 。 如果没有,你不会告诉内核它是什么,因此内核不知道用什么程序来解释它。 它可能是bash
, perl
, python
, sh
或其他东西。 (实际上,内核通常使用用户的默认shell来解释文件,这是非常危险的,因为它可能根本不是正确的解释器,或者它可能能够解析其中的一些文件,但是具有微妙的行为差异,例如sh
和bash
之间的情况)。
关于/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?