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


16

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

img1

img2


1
如果必须像这样通过另一个命令传递命令输出,YOUR COMMAND | indent还是必须像这样在其前面键入另一个命令(甚至只能是下划线),那可以_ YOUR COMMAND吗?
字节指挥官

1
@ByteCommander我已经考虑过了,但是我这样做是为了易于使用并使控制台输出更易于阅读。因此,我认为解决我的所有命令都不可行。谢谢您的回复,不过请编辑!
吴功夫(Alex Ng)

1
[请不要张贴文本输出的摘要。](meta.askubuntu.com/q/8713/85695
terdon

Answers:


15

您可以执行以下操作-使用文件描述符:

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

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

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

从这一点来看,任何写入标准输出的进程都将通过paste命令在开始时插入制表符对该输出进行“过滤” 。

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

    exec 1>&3 3>&-

非常感谢您的回复。即使它不是完美的,这也是我所能找到的最接近的解决方案。
Alex Ng

@AlexNg感谢您的支持-具体地,它没有按照您的要求做什么?如果您让我知道,我会尝试改善它
钢铁司机

举几个例子:输入命令后,某些命令确实可以正常工作,例如'php -v','hostname'等。但是,当使用诸如“ echo Hello World”之类的命令时,输出将与输入内联显示,并且在输入下一条命令时也会对输入的视觉外观产生不利影响。制表过程也不会影响其他一些命令,例如输入诸如“ asdasd”之类的无效命令时。
亚历克斯·伍

最后,它不能正确显示发生变化的输出(不知道如何正确描述这一点,抱歉)。例如,如果使用命令“ apt-get update”,则将其与没有制表过程的控制台进行比较时会有明显的不同。
Alex Ng

问题在于这种方法仅处理STDOUT(流1),而不处理STDERR(流2)。它还会中断使用less或类似工具允许滚动输出的程序的输出,例如man
字节指挥官

9

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

一个例子:

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

该函数的代码只能是:

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

您可以将其附加到~/.bashrc文件中,以便通过运行以下命令在用户的所有Bash会话中可用:

echo '_(){ sed "s/^/\t/" <($*); }' >> ~/.bashrc

如果您想将其提供给所有用户,请将其附加到/etc/bash.bashrc(需要管理员权限):

echo '_(){ sed "s/^/\t/" <($*); }' | sudo tee -a /etc/bash.bashrc

另外,您也可以创建一个脚本文件,/usr/local/bin/_其中包含以下内容,以在没有Bash功能的情况下为所有用户实现相同的功能:

#!/bin/bash
sed "s/^/\t/" <($*)

使用以下命令保存文件后,必须使脚本可执行

sudo chmod +x /usr/local/bin/_

5

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

echo -e "\tHello World"

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

您可以通过更改环境变量的内容来自定义提示PS1。您可以在上面的屏幕快照来自的博客文章中看到有关如何执行此操作的小示例。如何详细使用那些所谓的ANSI转义序列,如何使用更舒适的工具,如何在新终端中默认应用更改等,不在此答案的范围之内。但是,如果您决定使用该技术,则网络上会有很多教程和更多信息。


感谢您的答复,但是我已经按照自己的喜好更改了PS1。
亚历克斯·伍
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.