如何在Unix控制台或Macterminal上运行shell脚本?

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

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

 sh myscript 

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

 bash myscript 

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

 /foo/bar /bin/bar ./bar 

要使脚本可执行,请给予必要的权限:

 chmod +x bar ./bar 

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

 #! /usr/bin/env bash 

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

这意味着每个可执行的脚本都应该有一个hashbang 。 如果不是这样,你不会告诉内核它什么,因此内核不知道用什么程序来解释它。 它可能是bashperlpythonsh或者其他的东西。 (实际上,内核通常会使用用户的默认shell来解释这个文件,这是非常危险的,因为它可能根本就不是正确的解释器,或者它可能能够parsing一些文件,但是具有微妙的行为差异,比如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中的某个目录中,并且系统应该能够在按名称运行时find您的程序。

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

 #!bash 

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

 #!/usr/bin/env bash 

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

这种方法还有另外一个好处:某些系统可能带有/bin/bash ,但是用户可能不喜欢它,可能会发现它有错误或过时,并且可能在别的地方安装了自己的bash 。 在Mac OS X(Mac)上,苹果发行过时/bin/bash ,用户使用Homebrew等方式安装最新的/usr/local/bin/bash 。 当您使用执行PATHsearch的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 

如果你想让脚本在当前的shell中运行(例如,你希望它能够影响你的目录或环境),你应该说:

 . /path/to/script.sh 

要么

 source /path/to/script.sh 

请注意,例如, /path/to/script.sh可以是相对的. bin/script.sh . bin/script.sh在当前目录下的bin目录中运行script.sh

首先,给予执行许可:
chmod +x script_name

  1. 如果脚本不可执行: –
    为了运行sh脚本文件:
    sh script_name
    为了运行bash脚本文件:
    bash script_name
  2. 如果脚本是可执行的: –
    ./script_name

注意 :你可以通过使用'ls -a'来检查文件是否可执行