grepとlsでパイプ後に色が出る出ないの違いについて、もしかしたらprintfとfwriteの違いなのかもしれないと、ふと思いつきました。
各manを確認します。
man 3 printf。
PRINTF(3) Linux Programmer's Manual PRINTF(3) 名前 printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 指定された書式に変換して出力を行う 書式 #include <stdio.h> int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); int sprintf(char *str, const char *format, ...); int snprintf(char *str, size_t size, const char *format, ...); ~省略~
次に、man 3 fwrite。
FREAD(3) Linux Programmer's Manual FREAD(3) 名前 fread, fwrite - バイナリストリームの入出力 書式 #include <stdio.h> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 説明 fread() 関数は stream ポインターで指定されたストリームから nmemb 個の データを読み込み、 ptr で与えられた場所に格納する。 個々のデータは size バイトの長さを持つ。 fwrite() 関数は ptr で指定された場所から得た nmemb 個のデータを、 stream ポインターで指定されたストリームに書き込む。 個々のデータは size バイトの長さを持つ。
fwriteはあくまでもバイナリストリームなので、これが色が付く理由なのかもしれない!
(間違ってるかもしれませんが)
Cプログラミングで確認してみましょう。
takk@deb9:~/tmp$ cat -n fwrite-sample.c 1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 7 char *dat = "\33[33mYELLOW\n\33[49;39m\n"; 8 9 fwrite(dat, sizeof(char), strlen(dat), stdout); 10 11 } takk@deb9:~/tmp$
実行してみます。
色つきますね。
ではパイプを通すとどうなるか。
おっ、黄色のままです。
やはり、fwriteを使うと色が出る、が正解でしょうか。
でも、まだ分かりません。printfでもやってみます。
takk@deb9:~/tmp$ cat -n printf-sample.c 1 #include <stdio.h> 2 3 int main() 4 { 5 printf("\33[33m"); 6 printf("YELLOW\n"); 7 printf("\33[49;39m\n"); 8 } takk@deb9:~/tmp$
簡単なプログラムですね。
実行してみます。
黄色出ました。
パイプ後に、白に戻っていたら当たりです。
あれ、黄色のままです。
printfでもちゃんとエスケープシーケンス出てますね。どういうことでしょう。
謎は深まる。
つづく
コメント