我正在编写一段有多个输出的代码。输出内容的部分有两个函数,第一个函数输出一些缩进的消息。我希望第二个函数从上一个输出的缩进级别开始打印一些东西。所以第二个函数应该知道第一个函数的缩进级别。我如何做到这一点?
outputfunction1 outputfunction2
而不是
谢谢大家
gupuwyp21#
您可以使用以下run_indented函数调用您的函数/命令:
run_indented
run_indented() { local indent=${INDENT:-" "} { "$@" 2> >(sed "s/^/$indent/g" >&2); } | sed "s/^/$indent/g" }
示例:
foo() { echo "foo" run_indented bar } bar() { echo "bar" } run_indented bar run_indented foo
输出:
bar
和
foo bar
正如你可以正确嵌套输出。没有必要保持全球性的关注。如果一个函数的输出被修改为前缀,那么就没有转义了,因为缩进的函数调用的所有内容都将继承函数的文件描述符,而这些文件描述符将被缩进。也就是说,如果一个函数的输出已经缩进,调用另一个函数run_indented,缩进堆叠并创建嵌套输出。
vzgqcmou2#
这是一个有趣(但可怕)的想法。
#!/bin/sh function1() { printf '\t\toutputfunction1\n'; } function2() { echo bar; } indent (){ indent=$(printf '%s' "$(for ((i=$1; $i>0; i--)); do printf '\t'; done)") shift $@ | sed "s/^/$indent/" } get_indent() { # Call a function and return the indentation of the last line. $@ | awk '1; END{ exit( match($0, "[^\t]") -1 )}' } get_indent function1 indent $? function2
请注意,这依赖于将“数量”定义为硬选项卡的数量。我将把它留给读者作为一个练习,让读者对任意空格进行这种操作。
2条答案
按热度按时间gupuwyp21#
您可以使用以下
run_indented
函数调用您的函数/命令:示例:
输出:
和
正如你可以正确嵌套输出。
没有必要保持全球性的关注。
如果一个函数的输出被修改为前缀,那么就没有转义了,因为缩进的函数调用的所有内容都将继承函数的文件描述符,而这些文件描述符将被缩进。
也就是说,如果一个函数的输出已经缩进,调用另一个函数
run_indented
,缩进堆叠并创建嵌套输出。vzgqcmou2#
这是一个有趣(但可怕)的想法。
请注意,这依赖于将“数量”定义为硬选项卡的数量。我将把它留给读者作为一个练习,让读者对任意空格进行这种操作。