如何在执行的命令的输出行前插入制表符

如何在执行的命令的输出行前插入制表符

这只是一个简单的问题。是否可以在 Ubuntu 16.04 LTS 上选中输出?我在下面创建了两个图像来尝试说明我的意思。

图片1

图片2

答案1

你可以做这样的事情-使用文件描述符:

  1. 保存当前输出描述符,以便我们稍后恢复它

    exec 3>&1
    
  2. 重定向输出流到流程替代插入标签 - 例如

    exec 1> >(paste /dev/null -)
    

从此时起,任何写入标准输出的进程都会通过paste在开头插入制表符的命令对该输出进行“过滤”。

  1. 完成后,您可以通过恢复保存的文件描述符并关闭临时文件来恢复正常行为

    exec 1>&3 3>&-
    

答案2

我知道这个答案对你来说不是最佳的,但是你可以创建一个具有简单名称的 Bash 函数_(或任何其他尚未使用的名称),它运行作为参数获取的命令并使用制表符缩进其所有输出。

一个例子:

$ _ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 16.04 LTS
    Release:    16.04
    Codename:   xenial

更复杂的 shell 构造也是可能的,但需要将其作为引用参数或使用转义的特殊字符来给出,以防止在传递给函数之前进行评估。

$ _ 'for x in {1..3} ; do echo $x ; done'
    1
    2
    3

$ _ for x in \{1..3\} \; do echo \$x \; done
    1
    2
    3

该函数的代码仅为:

_(){ eval "$@" |& sed "s/^/\t/" ; return "$PIPESTATUS" ;}

作为副作用,这会将 STDERR 合并到 STDOUT 中以便缩进两者,但另一方面它还保留了给定命令的退出状态。

您可以将上面这一行附加到您的~/.bashrc文件中,以便它可以在用户的​​所有 Bash 会话中可用。


此答案的先前版本建议使用下面的函数,但这不会缩进 STDERR 流,也不会在给定命令失败时抑制返回/退出代码。此外,由于错误的$*变量扩展而不是,它会破坏带有引号或大量空格的命令"$@",并且可能存在更多问题...

_(){ sed "s/^/\t/" <($*); }

答案3

具体来说echo,你可以让它解释反斜杠转义符,例如\t(a制表位) 使用-e开关:

echo -e "\tHello World"

但以这种方式修改每个命令的输出几乎不可行(或可能)。如果您的目标是易于阅读,您可能需要研究自定义命令提示符的外观(例如颜色),如下所示:

您可以通过更改环境变量的内容来自定义提示PS1。您可以在博客文章上面的截图来自。如何详细使用这些所谓的 ANSI 转义序列、如何使用更舒适的工具、如何在新终端中默认应用更改等超出了本答案的范围。但如果您决定使用该技术,网络上有很多教程和更多信息。

答案4

我发现了一个更简单的方法:

your-command | paste /dev/null -

man paste.1

将由每个文件中按顺序对应的行(以 TAB 分隔)组成的行写入标准输出。

相关内容