ユーティリティの実行時にdc
非常に大きな数字を入力すると、次のように表示されます。
99999999999999999999999999999999999999999999999999999999999999999999999
プリントを使用すると、次のような結果がp
得られます。
999999999999999999999999999999999999999999999999999999999999999999999\
999
69ビット後に出力を分割するのはなぜですか?
答え1
少なくともGNU実装の場合、dc
70文字はハードコードされていますDEFAULT_LINE_MAX
。もちろん、DC_LINE_LENGTH
環境変数を設定してこれを上書きすることもできます。からdc/numeric.c
:
559 static int out_col = 0;
560 static int line_max = -1; /* negative means "need to check environment" */
561 #define DEFAULT_LINE_MAX 70
562
563 static void
564 set_line_max_from_environment(void)
565 {
566 const char *env_line_len = getenv("DC_LINE_LENGTH");
567 line_max = DEFAULT_LINE_MAX;
568 errno = 0;
569 if (env_line_len) {
570 char *endptr;
571 long proposed_line_len = strtol(env_line_len, &endptr, 0);
572 line_max = (int)proposed_line_len;
573
574 /* silently enforce sanity */
575 while (isspace(*endptr))
576 ++endptr;
577 if (*endptr || errno || line_max != proposed_line_len
578 || line_max < 0 || line_max == 1)
579 line_max = DEFAULT_LINE_MAX;
580 }
581 }
582
だから
$ dc
999999999999999999999999999999999999999999999999999999999999999999999999
p
999999999999999999999999999999999999999999999999999999999999999999999\
999
q
しかし、
$ DC_LINE_LENGTH=0 dc
999999999999999999999999999999999999999999999999999999999999999999999999
p
999999999999999999999999999999999999999999999999999999999999999999999999
q
$
答え2
端末は伝統的に80×24(またはそれ以上)であり、これらの環境では長い改行が問題になる可能性があり、これはUNIXの従来の長い改行の使用を説明できます\
。
これは非常に古い制限ですdc(1)
。バージョン 6 AT&T UNIXソースは次のとおりです。
dc1.s:ll: 70. /line length
(レトロなコンピューティングを実行している人は、なぜ長い行が問題なのかを詳しく教えてくれるかもしれません。ページに合わせる必要があります...)