栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在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
,或别的东西。(实际上,内核通常会使用用户的默认外壳程序来解释文件,这是非常危险的,因为它可能根本不是正确的解释器,或者它可能能够解析其中的某些文件,但是行为上却存在细微差别,例如之间的情况下
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
。幸运的是,几乎所有系统都在中
env
安装了程序
/usr/bin
。因此,我们开始
env
使用硬编码的路径,然后进行
PATH
搜索
bash
并运行该路径,以便它可以解释您的脚本:

#!/usr/bin/env bash

这种方法有一个缺点:根据POSIX,hashbang可以有 一个参数
。在这种情况下,我们将其

bash
用作
env
程序的参数。这意味着我们没有空间将参数传递给
bash
。因此,没有办法将类似的东西转换
#!/bin/bash-exu
为这种方案。您必须
set -exu
改用hashbang代替。

这种方法还具有另一个优点:有些系统可能附带

/bin/bash
,但用户可能不喜欢它,可能发现它有错误或过时,并且可能在
bash
其他地方安装了自己的。在OS
X(Macs)上通常是这种情况,其中Apple交付了过时的产品
/bin/bash
,用户
/usr/local/bin/bash
使用Homebrew之类的软件安装了最新版本。当您使用
env
进行
PATH
搜索的方法时,您会考虑用户的偏好,并使用他的首选bash而不是系统附带的bash。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/415395.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号