gpt4 book ai didi

bash - 如何使用 `local -` 将 shell 选项限制为函数?

转载 作者:行者123 更新时间:2023-11-29 09:14:29 25 4
gpt4 key购买 nike

local 的 BASH 手册页说

local [option] [name[=value] ... | - ]
[…] If name is ‘-’, the set of shell options is made local to the
function in which local is invoked: shell options changed using the
set builtin inside the function are restored to their original
values when the function returns.

因此,基于此信息,使用 local -,我应该能够在函数内部使用 set -x 来启用跟踪输出。当函数结束时,跟踪输出将被禁用。

#!/bin/bash
foo() {
local -
set -x
... # this code is shown in trace output
}

# trace output is disabled
foo
# trace output should be disabled here

这是行不通的。运行脚本时,我收到错误消息

第 3 行:local: '-': not a valid identifier

在 foo 函数返回后,脚本的其余部分仍然启用跟踪输出。

我已经在 OSX 上的 BASH 4.4 和 SLES 上的 Ubuntu 和 BASH 3.2 下尝试过这个。

最佳答案

根据 Bash 发布日志,local - 是一个 new feature bash 4.4。我怀疑您的机器上可能确实安装了 Bash 4.4,但尚未将其设置为您的登录 shell 和/或它不在路径 /bin/bash 您在 shebang 中指定的。

您可以通过以下方式验证这一点:

$ echo "$BASH_VERSION" 

4.4.12(1)-release

根据您安装 Bash 4.4 的位置,您可以通过以下方式升级和使用此功能:

##########################################
# OSX: Bash 4.4 installed via HomeBrew
##########################################

# Add the new shell to the list of allowed shells
echo /usr/local/bin/bash | sudo tee -a /etc/shells

# Change to the new shell
chsh -s /usr/local/bin/bash

您还需要使用正确的 shebang 路径。好消息是,如果您已经将 Bash 4.4 设置为您的登录 shell(如上),那么您可以简单地使用:

#!/usr/bin/env bash

如果您发现您没有安装 Bash 4.4,这里有一个简单的指南 upgrade to Bash 4.4 on OSX .

即使是 2017 年新款 MacBook Pro 机型也附带旧的 Bash 3.2。除非您手动升级了您的用户 bash 登录 shell,否则您将没有 Bash 4.4,也没有 local - 功能。

关于bash - 如何使用 `local -` 将 shell 选项限制为函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com