如何在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?
