如何在bash中覆盖函数重定向?
我最近发现了一些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 ================ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |