如何在 Unix 控制台或 Mac 终端上运行 shell 脚本?
- 2024-10-23 08:47:00
- admin 原创
- 359
问题描述:
我知道,忘记,然后重新学习。是时候把它写下来了。
解决方案 1:
要运行不可执行的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
或其他东西。(实际上,内核通常会使用用户的默认 shell 来解释文件,这非常危险,因为它可能根本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(Mac)上,Apple 附带了过时的版本,而用户使用 Homebrew 之类的东西/bin/bash
安装最新版本。当您使用进行搜索的方法时,您会考虑用户的偏好并使用他喜欢的 bash,而不是系统附带的版本。/usr/local/bin/bash
`env`PATH
解决方案 2:
要启动 shell 脚本‘file.sh’:
sh file.sh
bash file.sh
另一个选项是使用 chmod 命令设置可执行权限:
chmod +x file.sh
现在运行.sh文件如下:
./file.sh
解决方案 3:
对于 Bourne shell:
sh myscript.sh
对于 bash:
bash myscript.sh
解决方案 4:
如果您希望脚本在当前 shell 中运行(例如,您希望它能够影响您的目录或环境),您应该说:
. /path/to/script.sh
或者
source /path/to/script.sh
注意/path/to/script.sh
可以是相对的,例如在当前目录下的目录中. bin/script.sh
运行。script.sh
`bin`
解决方案 5:
首先,允许执行:-
chmod +x script_name
如果脚本不可执行:-
运行 sh 脚本文件:-
sh script_name
运行 bash 脚本文件:-
bash script_name
如果脚本可执行:-
./script_name
注意:您可以使用“ls -a”检查该文件是否可执行
解决方案 6:
Terminal.app 的文件扩展名为 .command。双击任何 .command 文件即可执行该文件。
扫码咨询,免费领取项目管理大礼包!