どんなコマンドでも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、それが私の問題に役立つかどうかはわかりません
他のいくつかのスタックオーバーフローの回答で概説されているように、いくつかのオプションがあります( Caarlos の comment を参照)。ここでそれらを要約します。
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 )
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
これは、TTYがどのように機能し、Pseudo-TTY(PTY)がどのように機能するかについての優れた記事です。Linuxシェルがファイル記述子でどのように動作し、入力、出力、および信号を渡すのかを理解したい場合は、一読に値します。 http://www.linusakesson.net/programming/tty/index.php