我正在运行命令,我想按每个命令对它们进行专门分组,如下例所示。尝试打印,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 的输出也没有在此处添加代码前缀。