コマンドの各出力に文字を追加するにはどうすればよいですか?

コマンドの各出力に文字を追加するにはどうすればよいですか?

コマンドを実行しており、以下の例に示すように、各コマンドごとに具体的にグループ化したいと思います。印刷しようとしましたが、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/^/| /'

これは単純なコマンドではうまく機能しますが、より複雑なアプリケーションはカーソルをマイナーな方法で配置し、複数のコマンドの出力を遅らせるため失敗します(ラインバッファリングでより大きなバッファ領域を使用してコマンドが実行されたことを確認する)。標準出力は端末です)。

私は通常このアプローチをあきらめ、代わりに目立つシェルプロンプトを設定することをお勧めします(太字、イタリック体、色、背景色、特殊な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に送信された出力にも、プレフィックスが付いたコードはありません。

関連情報