web-dev-qa-db-ja.com

どんなコマンドでもbashのttyのふりをする

grepを使用し、それを他のプログラムにパイプするときはいつでも、--colorオプションは考慮されません。 --color=alwaysですが、ttyを使用している場合に得られる出力として、そのコマンドの正確な出力を取得したい他のいくつかのコマンドも考えられます。

だから私の質問は、コマンドがtty内で実行されているとコマンドをだまして考えることは可能ですか?

たとえば、

grep --color Word file # Outputs some colors
grep --color Word file | cat # Doesn't output any colors

私は次のようなものを書くことができるようにしたいと思います:

IS_TTY=TRUE grep --color Word file | cat  # Outputs some colors

この質問 には、私が望むことを実行するツールがあるようです: 空-疑似端末(PTY)の下でプロセスとアプリケーションを実行します ですが、 docs、それが私の問題に役立つかどうかはわかりません

23
edi9999

他のいくつかのスタックオーバーフローの回答で概説されているように、いくつかのオプションがあります( Caarloscomment を参照)。ここでそれらを要約します。

  1. script + printfを使用します。追加の依存関係は必要ありません。

    0<&- script -qefc "ls --color=auto" /dev/null | cat
    

    または、bash関数fakettyを作成してカプセル化します。

    faketty () {
        script -qfce "$(printf "%q " "$@")"
    }
    faketty ls --color=auto | cat  
    

    または魚の殻で:

    function faketty
        script -qefc "(printf "%q " "$argv")"
    end
    faketty ls --color=auto | cat 
    

    (クレジットはこれに行きます answer

    http://linux.die.net/man/1/script

  2. unbufferコマンドを使用してくださいexpectコマンドスイートの一部として)。残念ながら、これには50mb以上のインストールが必要です。しかし、それは最も簡単な解決策です:

    Sudo apt-get install expect-dev
    unbuffer -p ls --color=auto | cat  
    

    または、魚のシェルを使用する場合:

    function faketty
        unbuffer -p $argv
    end
    faketty ls --color=auto | cat 
    

    http://linux.die.net/man/1/unbuffer

これは、TTYがどのように機能し、Pseudo-TTY(PTY)がどのように機能するかについての優れた記事です。Linuxシェルがファイル記述子でどのように動作し、入力、出力、および信号を渡すのかを理解したい場合は、一読に値します。 http://www.linusakesson.net/programming/tty/index.php

22
Nick Sweeting