GNU/Linux >> Linux の 問題 >  >> Linux

Lsによって出力される行数?

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 60stty -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;
}

Linux
  1. ターミナルで利用可能な垂直線の数を見つける方法は?

  2. データファイルからランダムに特定の数の線を描画しますか?

  3. Linuxコマンドラインでファイルの特定の行を表示する方法

  1. grep から返される結果の数を制限するにはどうすればよいですか?

  2. ファイルの行数だけを取得する方法

  3. データファイルから特定の数の行をランダムに描画します

  1. GitHubリポジトリからコードの行数を検索します

  2. 行の発生数を並べ替えてカウントしますか?

  3. 各ファイルにヘッダーを含む行数でファイルを分割しますか?