加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在bash中覆盖函数重定向?

发布时间:2020-12-15 22:57:21 所属栏目:安全 来源:网络整理
导读:我最近发现了一些bash代码,它使用了鲜为人知的(好吧,对我来说鲜为人知)功能重定向的功能,例如大大简化: function xyzzy () { echo hello} /dev/null 当您使用简单的xyzzy调用该函数时,它会自动应用附加到函数的重定向,无论您在调用它时执行了什么操作. 我想
我最近发现了一些bash代码,它使用了鲜为人知的(好吧,对我来说鲜为人知)功能重定向的功能,例如大大简化:

function xyzzy () {
    echo hello
} >/dev/null

当您使用简单的xyzzy调用该函数时,它会自动应用附加到函数的重定向,无论您在调用它时执行了什么操作.

我想知道的是,在调用函数本身时是否有任何方法可以覆盖此行为,以查看正在生成的消息.我很谨慎地改变包含所有功能的文件,因为(1)它很大,(2)它经常变化,(3)它受到支持它的组的严格保护.

我试过了:

xyzzy >&1

尝试覆盖它但输出仍然没有显示(可能是因为>& 1可能被视为无操作).

换句话说,给定脚本:

function xyzzy () {
    echo hello
} >/tmp/junk

rm -f /tmp/junk
echo ================
echo Standard output
echo ----------------
xyzzy # something else here
echo ================
echo Function capture
echo ----------------
cat /tmp/junk
echo ================

它目前输出:

================
Standard output
----------------
================
Function capture
----------------
hello
================

我可以将xyzzy调用更改为什么,以便在标准输出部分而不是函数捕获部分打印hello?

并且这需要在创建文件之后不尝试读取文件/ tmp / junk,因为实际的重定向可能是/ dev / null,因此它们不会在文件中.

解决方法

我能想到的唯一想法是解析declare -f function_name的输出并删除重定向.

这可能是最简单的方法.请注意,您需要将awk脚本定制到特定的功能布局,并且它根本不会修改函数体.这意味着您只能在顶层关闭重定向.您可以修改函数的整个调用树以关闭重定向,但这需要一个能够识别和更改正文中函数调用的bash解析器.

以下脚本显示了如何使用示例函数执行此操作.所有awk命令都会创建一个新函数my_xyzzy,它除了最后一行之外还会反映xyzzy函数,从而有效地将其转换为:

function my_xyzzy () {
    echo hello
}

完整的脚本按照规范:

function xyzzy () {
    echo hello
} >/tmp/qqqq

declare -f xyzzy | awk '
    NR==1 {print "my_xyzzy ()"}
    NR==2 {prev=$0}
    NR>2  {print prev;prev=$0}
    END   {print "}"}' >$$.bash
. $$.bash
rm -f $$.bash

rm -f /tmp/qqqq
echo ================
echo Standard output
echo ----------------
my_xyzzy
echo ================
echo Function capture
echo ----------------
cat /tmp/qqqq
echo ================

输出是:

================
Standard output
----------------
hello
================
Function capture
----------------
cat: /tmp/qqqq: No such file or directory
================

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读