AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 565128
Accepted
Eduardo Lucio
Eduardo Lucio
Asked: 2020-02-01 06:33:19 +0800 CST2020-02-01 06:33:19 +0800 CST 2020-02-01 06:33:19 +0800 CST

bash 函数 - 获取变量内的函数标准输出值并修改函数外的变量

  • 772

由于特定需要,我需要将 bash 函数的所有标准输出输出存储在一个变量(“F_MY_FUNC_R”)中,但我还需要该函数来修改某些变量(“VAL_A”和“VAL_B”)的值在下面编码。

问题:为什么变量 VAL_A 和 VAL_B 没有被修改?有没有解决的办法?

代码

VAL_A="none"
VAL_B="none"
f_my_func() {
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    VAL_A="some value"
    VAL_B="some value"
}
F_MY_FUNC_R=$(f_my_func)
echo "$F_MY_FUNC_R"
echo "$VAL_A"
echo "$VAL_B"

输出

[root@localhost some_folder]# echo "$F_MY_FUNC_R"
some info some info some info some info some info 
some info some info some info some info some info 
some info some info some info some info some info 
some info some info some info some info some info 
[root@localhost some_folder]# echo "$VAL_A"
none
[root@localhost some_folder]# echo "$VAL_B"
none

谢谢!=D

bash shell-script
  • 2 2 个回答
  • 854 Views

2 个回答

  • Voted
  1. user232326
    2020-02-01T07:07:10+08:002020-02-01T07:07:10+08:00

    子shell不能修改其父变量或环境,这是shell 的基本规则。在子 shell$(f_my_func)中执行函数会受到该规则的影响,并且父变量 VAL_A 和 VAL_B 不会更改。

    如果您确实需要更改函数中的父变量,则不要捕获函数的输出,将输出设为其他变量:

    VAL_A="none"
    VAL_B="none"
    f_my_func() {
        nl=$'\n'
        F_MY_FUNC_R="some info some info some info some info some info $nl"
        F_MY_FUNC_R+="some info some info some info some info some info $nl"
        F_MY_FUNC_R+="some info some info some info some info some info $nl"
        F_MY_FUNC_R+="some info some info some info some info some info "
        VAL_A="some value"
        VAL_B="some value"
    }
    f_my_func
    echo "$F_MY_FUNC_R"
    echo "$VAL_A"
    echo "$VAL_B"
    
    • 2
  2. Best Answer
    Eduardo Lucio
    2020-02-01T07:24:09+08:002020-02-01T07:24:09+08:00

    这是我的“肮脏”解决方案... =D

    注意:正如我所说,我的实际功能很大,所以我想将此功能的输出(echo基本上)保存在一个日志文件中,该文件由F_MY_FUNC_OP. 除此之外,我的日志记录方案使用并由F_MY_FUNC_OP许多遗留组件组成。

    VAL_A="none"
    VAL_B="none"
    f_my_func() {
        echo "$(date)"
        VAL_A="some value"
        VAL_B="some value"
    }
    f_my_func > f_my_func_op 2>&1
    F_MY_FUNC_OP=$(cat f_my_func_op)
    rm -f "f_my_func_op"
    echo "$F_MY_FUNC_OP"
    echo "$VAL_A"
    echo "$VAL_B"
    

    这样,我可以执行函数并将其 stderr 和 stdout 重定向到文件,同时允许操作函数外部的变量(“$VAL_A”和“$VAL_B”的情况),否则(“F_MY_FUNC_OP=例如,$(f_my_func)" 或 "F_MY_FUNC_OP=`f_my_func`") 函数将在“子shell”中执行,并且无法操作这些变量。

    感谢@jesse_b、@AdminBee 和@Isaac!=D

    • 0

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • MySQL Select with function IN () with bash array

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve