如何为命令的每个输出添加一个字符?

如何为命令的每个输出添加一个字符?

我正在运行命令,我想按每个命令对它们进行专门分组,如下例所示。尝试打印,echo -e '| $line'但它只影响输出文件中包含的文本的命令。

背景

最初我看到一个视频,其中显示的终端命令是有些使用“|”分组就像下面的示例一样。我正在尝试为我的.bashrc/.bash_profile文件自定义或创建一个函数,以便所有输出都有一个“|”输出每行开头的字符。

还发现讨论这里。所以很可能我会为 STDERR 和 STDOUT 创建一个函数(就像提到的那样)这里)。

例子

+>system:~/sample
| No command 'sample' found, did you mean:
|  Command 'yample' from package 'yample' (universe)
|  Command 'ample' from package 'ample' (universe)
| sample: command not found
+>system:~/sudo apt-get update 
| [sudo] password for system: 
| Ign http://dl.google.com stable InRelease
| Hit http://dl.google.com stable Release.gpg                                    
| Ign http://security.ubuntu.com trusty-security InRelease                       
| yadda yadda ...
+>system:~/

答案1

您可以尝试通过一个sed命令进行管道传输,将行的开头 ( ^) 替换为您想要的任何前缀 ( |),例如:

some_command | sed 's/^/| /'

这适用于更简单的命令,但会失败,因为更复杂的应用程序以某些不平凡的方式定位光标,并且还会延迟多个命令的输出(因为它们从行缓冲切换到使用更大的缓冲区,看到它们的标准输出是不是终端)。

我通常建议放弃这种方法,而是配置一个突出的 shell 提示符(使用粗体、斜体、颜色、背景颜色、特殊 Unicode 字符,无论您遇到什么)。

答案2

人们可以做这样的事情

LC_ALL=C cm='update-alternatives --display java'; i=0 ; \
while read -r line ; \
do let i++; printf "%s | %3d | %s\n" "$cm" "$i"  "${line}" ; \
done < <($cm)

这给出了一些输出,例如:

update-alternatives --display java |   1 | java - auto mode
update-alternatives --display java |   2 | link best version is /usr/lib/jvm/java-11-openjdk-amd64/bin/java
update-alternatives --display java |   3 | link currently points to /usr/lib/jvm/java-11-openjdk-amd64/bin/java
update-alternatives --display java |   4 | link java is /usr/bin/java
update-alternatives --display java |   5 | slave java.1.gz is /usr/share/man/man1/java.1.gz
update-alternatives --display java |   6 | /usr/lib/jvm/java-11-openjdk-amd64/bin/java - priority 1111
update-alternatives --display java |   7 | slave java.1.gz: /usr/lib/jvm/java-11-openjdk-amd64/man/man1/java.1.gz

我没有解决方案将其添加到 bash 中运行的所有命令中。人们可以将一些东西包装到一个 bash 函数中,如下所示:

#!/bin/bash

function ao() {
  export LC_ALL=C
  cm="$*";
  i=0;
  while read -r line ; 
  do
    ((i++));
    printf "%s | %3d | %s\n" "$cm" "$i"  "${line}";
  done < <($cm )
}

将其保存到一个文件中,我们将其命名为 addoutput.txt。然后获取这个文件:

. addoutput

然后,您可以在所有命令上使用该函数

ao yourcommand

请注意,正如 @egmont 所提到的,根据命令,您的输出可能不是您想要的。发送到 /dev/stderr 的输出也没有在此处添加代码前缀。

相关内容