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

Ale*_* Ng 18 command-line bash

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

图像1

图像2

ste*_*ver 16

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

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

    exec 3>&1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将输出流重定向到插入选项卡的进程替换- 例如

    exec 1> >(paste /dev/null -)
    
    Run Code Online (Sandbox Code Playgroud)

从这一点开始,任何写入标准输出的进程都将通过paste命令“过滤”该输出以在开始时插入选项卡。

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

    exec 1>&3 3>&-
    
    Run Code Online (Sandbox Code Playgroud)


Byt*_*der 10

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

一个例子:

$ _ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 16.04 LTS
    Release:    16.04
    Codename:   xenial
Run Code Online (Sandbox Code Playgroud)

更复杂的 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
Run Code Online (Sandbox Code Playgroud)

此函数的代码仅为:

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

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

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


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

_(){ sed "s/^/\t/" <($*); }
Run Code Online (Sandbox Code Playgroud)


Hen*_*eck 5

有了echo具体而言,你可以把它解释反斜杠像\t(一个制表位)与-e开关:

echo -e "\tHello World"
Run Code Online (Sandbox Code Playgroud)

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

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