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でもちゃんとエスケープシーケンス出てますね。どういうことでしょう。
謎は深まる。
つづく


コメント