我正在编写一段具有多个输出的代码。我输出内容的部分有两个函数,第一个函数输出一些缩进的消息。我希望第二个函数从上一个输出的缩进级别开始打印一些内容。因此第二个函数应该知道第一个函数的缩进级别。我如何实现这一目标?
outputfunction1
outputfunction2
与
相反 outputfunction1
outputfunction2
谢谢大家
这是一个有趣(但很糟糕)的想法。
#!/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
请注意,这依赖于将“缩进”定义为硬制表符的数量。我将把它作为练习留给读者,让他们对任意空白执行此操作。
您可以使用以下
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
调用另一个函数,则缩进会堆积起来并创建嵌套输出。