问题

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



解决方法

要运行不可执行的 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 之间的情况).

A note on /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 ,然后对 bash 进行 PATH 搜索,并运行它以便解释您的脚本: / p>

#!/usr/bin/env bash

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

这种方法还有另一个优点:一些系统可能附带一个 / bin / bash ,但用户可能不喜欢它,可能会发现它的错误或过时,代码> bash .这通常是在OS X(Mac)上,Apple发布过时的 / bin / bash ,用户安装最新的 / usr / local / bin / bash 使用类似Homebrew的东西.当您使用执行 PATH 搜索的 env 方法时,您会考虑用户的首选项,并在其随附的系统上使用他偏好的bash.




相关问题推荐