【问题标题】:Indenting multi-line output in a shell script在 shell 脚本中缩进多行输出
【发布时间】:2013-07-05 08:49:14
【问题描述】:

我正在尝试更改我的 Ubuntu Amazon EC2 框上的每日消息 (MOTD),以便当我 SSH 进入时它会显示我的一个目录的 git 状态。

所有默认 MOTD 文件的输出在每行的开头都有两个空格,因此它看起来很好缩进,但是因为我的 git status 输出跨越多行,如果我在它只缩进第一行之前执行 echo -n " "行。

知道如何让它缩进每一行吗?

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    将它传递给sed,以便在每行的开头插入2个空格。

    git status | sed 's/^/  /'
    

    【讨论】:

    • 我不知道如何解决这个问题,但这有一个小问题。函数的退出代码被sed 销毁,这在某些情况下可能是个问题。
    • @cglacet 每当您将一个命令传递给另一个命令时,都是如此。如果有问题,您将输出重定向到文件或变量,测试退出状态,然后处理保存的输出。
    • @cglacet 在脚本的第二行指定set -euo pipefail 将为您测试它。
    【解决方案2】:

    基于@Barmar 的回答,这是一种更简洁的方法:

    indent() { sed 's/^/  /'; }
    
    git status | indent
    other_command | indent
    

    【讨论】:

    • 并没有真正增加太多,它是一个 shell 脚本中的一个用例,所以 bash 子例程有点矫枉过正,但是谢谢
    • @MattFletcher:嗯,我认为使用像这样的子例程编写代码可以让非 bash 教授(比如我自己)更容易弄清楚发生了什么。此外,如果您决定突然想要 3 个而不是 2 个空格,那么您只有一个地方需要更正。
    • @Vering 确实如此,我确实理解这样做的好处,我只是更多地暗示它可能是评论而不是答案本身,因为它几乎是相同的答案并解决了一开始就没有提出来的问题:)
    • @MattFletcher:好的,您可能对评论与回答有意见
    • 请记住,我提供了一个备用代码 sn-p。在没有代码格式的情况下,这并不适合在评论中描述。如果我只是对现有答案提供一两句评论,那在我看来更适合作为评论。
    【解决方案3】:

    感谢 @Barmar 和 @Marplesoft 提供了一些不错的简单解决方案 - 这是其他人可能喜欢的另一个变体 - 一个函数,您可以使用 pr 判断缩进级别:

    indent() {
      local indentSize=2
      local indent=1
      if [ -n "$1" ]; then indent=$1; fi
      pr -to $(($indent * $indentSize))
    }
    
    # Example usage
    ls -al | indent
    git status | indent 2
    

    【讨论】:

    【解决方案4】:

    这是我编写的一个函数,也用于缩进 stderr:

    function indented {
      local PIPE_DIRECTORY=$(mktemp -d)
      trap "rm -rf '$PIPE_DIRECTORY'" EXIT
    
      mkfifo "$PIPE_DIRECTORY/stdout"
      mkfifo "$PIPE_DIRECTORY/stderr"
    
      "$@" >"$PIPE_DIRECTORY/stdout" 2>"$PIPE_DIRECTORY/stderr" &
      local CHILD_PID=$!
    
      sed 's/^/  /' "$PIPE_DIRECTORY/stdout" &
      sed 's/^/  /' "$PIPE_DIRECTORY/stderr" >&2 &
      wait "$CHILD_PID"
      rm -rf "$PIPE_DIRECTORY"
    }
    

    像这样使用它:

    indented git status
    indented ls -al
    

    【讨论】:

      猜你喜欢
      • 2010-12-12
      • 2023-04-07
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 2013-10-16
      • 2015-03-08
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多