为什么 ls 命令在 tty 上打印多列,而其他地方只有一列?

5 unix shell ls

即使在使用类 Unix 操作系统几年之后,这种行为仍然让我感到困惑。

当我在包含大量文件的目录中使用 ls 命令时,输出通常很好地格式化为多列。下面是一个例子:

$ ls
a.txt  C.txt  f.txt  H.txt  k.txt  M.txt  p.txt  R.txt  u.txt  W.txt  z.txt
A.txt  d.txt  F.txt  i.txt  K.txt  n.txt  P.txt  s.txt  U.txt  x.txt  Z.txt
b.txt  D.txt  g.txt  I.txt  l.txt  N.txt  q.txt  S.txt  v.txt  X.txt
B.txt  e.txt  G.txt  j.txt  L.txt  o.txt  Q.txt  t.txt  V.txt  y.txt
c.txt  E.txt  h.txt  J.txt  m.txt  O.txt  r.txt  T.txt  w.txt  Y.txt
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将输出重定向到一个文件,或通过管道将其传输到另一个命令,则输出中只会出现一列。使用与上面相同的示例目录,这是我通过管道将 ls 传送到 wc 时得到的结果:

$ ls | wc
     52      52     312
Run Code Online (Sandbox Code Playgroud)

换句话说, wc 认为有 52 行,即使到终端的输出只有 5 行。

我没有在任何其他命令中观察到这种行为。你愿意向我解释一下吗?

pio*_*kuc 9

它只是检测到它的输出是终端设备并格式化输出,使其看起来更好。您可以使用选项 -C 将相同格式的 ls 输出打印到文件或管道。

如何检测输出是终端:https : //stackoverflow.com/questions/1061575/detect-in-c-if-outputting-to-a-terminal

  • 没问题。如果你的好奇心得到满足,那么我想你可以结束这个问题。 (2认同)