shell bash脚本的输出

s3fp2yjn  于 2023-10-23  发布在  Shell
关注(0)|答案(2)|浏览(165)

我正在编写一段有多个输出的代码。输出内容的部分有两个函数,第一个函数输出一些缩进的消息。我希望第二个函数从上一个输出的缩进级别开始打印一些东西。所以第二个函数应该知道第一个函数的缩进级别。我如何做到这一点?

outputfunction1
    outputfunction2

而不是

outputfunction1
outputfunction2

谢谢大家

gupuwyp2

gupuwyp21#

您可以使用以下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,缩进堆叠并创建嵌套输出。

vzgqcmou

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

请注意,这依赖于将“数量”定义为硬选项卡的数量。我将把它留给读者作为一个练习,让读者对任意空格进行这种操作。

相关问题