ls
の場合 が呼び出されると、現在のディレクトリ内のすべてのファイル/ディレクトリが出力され、各行にできるだけ多く収まるようになります。 wc -l
に渡されたのはなぜですか 、ファイル数を出力しますか?結果を出力する行数をどのように決定しますか?
承認された回答:
ls
の場合 実行されると、さまざまなオプションが解析されます。また、isatty()によって出力がttyであるかどうかを検出します。
ls.c:
コード
case LS_LS:
/* This is for the `ls' program. */
if (isatty (STDOUT_FILENO))
{
format = many_per_line;
/* See description of qmark_funny_chars, above. */
qmark_funny_chars = true;
}
else
{
format = one_per_line;
qmark_funny_chars = false;
}
break;
…
コード
/* disable -l */
if (format == long_format)
format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
など
必要に応じて、簡単なテストをコンパイルできます:
isawhat.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
if (isatty(STDOUT_FILENO)) {
fprintf(stdout, "Word by word my world.n");
} else {
fprintf(stdout, "HELP! Stranger handling my words!!n");
}
fprintf(stderr, "Bye bye.n");
return 0;
}
コンパイル者:
gcc -o isawhat isawhat.c
次に例:
$ ./isawhat | sed 's/word/world/'
幅は列で測定されます。 1列は1文字です。 80から始まり、環境変数COLUMNSが設定されており、SIZE_MAX以下の有効なintを保持しているかどうかを確認します(これはアーチに依存します。端末の幅はそれほど広くなりません(少なくともまだ))。
>
たとえば、試してみてください。 echo $COLUMNS
。これはおそらく、ウィンドウで使用可能な列の数を反映しています。ウィンドウのサイズが変更されると、これが更新されます。ほとんどの場合、さまざまなコマンドによってリセットされます。
少し難しく設定する1つの方法は、stty
を使用することです。 。例えば。 stty columns 60
。 stty -a
を使用します すべてを表示するには(man stty)。楽しいソフトウェアです。
コンパイルされている場合は、ioctl()によって列を照会し、ウィンドウサイズを検出します。stdoutのファイル番号をioctl
に渡すことによって リクエストTIOCGWINSZを構造winsize
に渡します 列の数で埋められます。
これは、単純なcコードでも示すことができます:
ウィンドウのコンパイル、実行、サイズ変更。更新する必要があります。 Ctrl+Cで終了します。
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <signal.h>
static int run;
void sig_handler(int sig) {
switch (sig) {
case SIGINT:
case SIGTERM:
case SIGSTOP:
run = 0;
break;
}
}
void sig_trap(int sig) {
if ((signal(sig, sig_handler)) == SIG_IGN)
signal(sig, SIG_IGN);
}
int main(void)
{
struct winsize ws;
sig_trap(SIGINT);
sig_trap(SIGTERM);
sig_trap(SIGSTOP);
run = 1;
while (run) {
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) {
fprintf(stdout, "r %s: %3d, %s: %dr",
"Columns", ws.ws_col,
"Rows", ws.ws_row
);
fflush(stdout);
}
usleep(5000);
}
fprintf(stdout, "n");
return 0;
}