当前位置: 首页 > 面试题库 >

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

臧兴学
2023-03-14
问题内容

我知道,忘记了,然后重新学习。是时候写下来了。


问题答案:

要运行不可执行的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 。如果不是,则您不会告诉内核它
什么,因此内核不知道使用什么程序来解释它。这可能是bashperlpythonsh,或别的东西。(实际上,内核通常会使用用户的默认外壳程序来解释文件,这是非常危险的,因为它可能根本不是正确的解释器,或者它可能能够解析其中的某些文件,但是行为上却存在细微差别,例如之间的情况下shbash)。

最常见的是,您会看到像这样的哈希爆炸:

#!/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。



 类似资料:
  • 在部署成功完成后,是否可以打印我的应用程序部署的URL?如果我能以某种方式获得这个URL,并将其打印在控制台上,那就最好了。 编辑我使用以下解决方案

  • 问题内容: 我是python的新手,已经学习了几周。但是,现在我刚刚更改了操作系统,现在正在使用ubuntu,并且无法在终端上运行任何脚本。 我确定有, 但是当我去终端输入时,例如 终端显示了这样的错误消息 python:无法打开文件“ test.py”:[Errno 2]没有这样的文件或目录 我该怎么办? 我必须将文件保存在任何特定的文件夹中以使其在终端上运行吗? 问题答案: 这个错误: pyt

  • 问题内容: 从Java运行Unix命令非常简单。 但是可以从Java代码运行Unix Shell脚本吗?如果是,从Java代码中运行Shell脚本是一个好习惯吗? 问题答案: 你应该真正看一下Process Builder。它确实是为这种事情而构建的。

  • 控制台与终端 [KNL] console=设备及选项 设置输出控制台使用的设备及选项。例如:ttyN 表示使用第N个虚拟控制台。其它用法主要针对嵌入式环境(Documentation/serial-console.txt)。 [KNL] consoleblank=秒数 控制台多长时间无操作后黑屏,默认值是600秒,设为0表示禁止黑屏。 [HW] no_console_suspend 永远也不要将控

  • 我有一台服务器(Ubuntu 14.04.4 LTS),并希望某个Java应用程序一直在其上运行。目前我使用

  • 问题内容: 我写了两个shell脚本和。在和我有一个无限的for循环,他们打印一些输出到终端。我想写另一个脚本,同时呼吁和,但我想用户立即恢复,而不是已经无限运行脚本的终端的控制,我想隐藏在终端输出。 问题答案: 使用,如果你的后台作业需要较长时间才能完成,或者你只是使用SecureCRT的或类似的东西登录服务器。 重定向 标准输出 和 标准错误 ,以忽略输出。