実行されたコマンドの出力行の前にタブを挿入する方法


16

簡単な質問です。Ubuntu 16.04 LTSで出力をタブ化することは可能ですか?これが意味することを説明するために、以下の2つの画像を作成しました。

img1

img2


1
コマンド出力を次のような別のコマンドにパイプするYOUR COMMAND | indent必要がある場合や、その前に別のコマンドを入力する必要がある場合(アンダースコアだけでも可能)、_ YOUR COMMAND大丈夫でしょうか?
バイトコマンダー

1
@ByteCommander私はそれを考えましたが、使いやすく、コンソール出力を読みやすくするためにこれを行っています。したがって、すべてのコマンドをパイプ処理することは解決策ではないと思います。返信してくれてありがとうございます!
アレックスNg

1
[テキスト出力のスクリーンショットを投稿しないでください。](meta.askubuntu.com/q/8713/85695
テルドン

回答:


15

ファイル記述子を使用すると、次のようなことができます。

  1. 現在の出力記述子を保存して、後で復元できるようにします

    exec 3>&1
  2. タブを挿入するプロセス置換に出力ストリームをリダイレクトします-例えば

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

この時点から、標準出力に書き込むプロセスはすべて、pasteコマンドを介して「出力」され、開始時にタブを挿入します。

  1. 完了したら、保存したファイル記述子を復元して一時的な記述子を閉じることにより、通常の動作を再開できます

    exec 1>&3 3>&-

回答ありがとうございます。これは完璧ではありませんが、私が解決策に最も近いものです。
アレックスNg

@AlexNgは賛成票に感謝します-あなたが求めたものを具体的にどのように行わないのですか?あなたが私にそれを改善しようとすることを知らせた場合
-steeldriver

例をいくつか示します。コマンドを入力した後、「php -v」、「hostname」など、一部のコマンドは意図したとおりに機能します。ただし、「echo Hello World」などのコマンドを使用する場合、出力は入力とインラインで表示され、次のコマンドを入力するときに入力の視覚的外観に悪影響を及ぼします。「asdasd」などの無効なコマンドを入力するときなど、他のコマンドもタブ処理の影響を受けません。
アレックスNg

最後に、変更された出力を正しく表示しません(これを適切に説明する方法がわかりません、謝罪)。たとえば、コマンド「apt-get update」を使用する場合、タブ処理なしでコンソールと比較すると、顕著な違いがあります。
アレックス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エスケープシーケンスの詳細な使用方法、より快適なツールの使用方法、新しいターミナルでデフォルトで変更を適用する方法などは、この回答の範囲外です。しかし、その手法を使用することに決めた場合、Webには多くのチュートリアルと詳細情報があります。


回答ありがとうございます。しかし、私はすでにPS1を自分の好みに変更しました。
アレックスNg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.