为什么重定向符号会改变ls的行为?

Yu *_* Fu 14 unix linux bash

因此,我总是怀疑在以下情况下重定向的工作原理:

  1. 我输入"ls",所有文件名都用空格分隔:

    test$ touch a b c
    test$ ls
    a b c
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我使用">"将STDOUT重定向到一个文件:

    test$ ls > ls.txt
    test$ cat ls.txt 
    a
    b
    c
    ls.txt
    
    Run Code Online (Sandbox Code Playgroud)

有趣的是,格式发生了变化,文件名由换行符分隔.似乎输出是由...生成的ls -1.

为什么后一种情况下的输出与前一种情况不同?ls实际上可以看到">"符号,以便改变它的行为吗?

Eri*_*hil 11

ls 测试其输出流以查看它是否是终端,并根据它修改其行为.

这是记录在案的; 文档的man页面有ls几个依赖于输出是否是终端的东西:

  • 如果输出是终端,-C(对于多列输出)是默认值,否则-1(单列)是默认值.
  • 如果使用-l或-s输出是终端,则所有文件大小或块的总和将分别打印在列表之前的一行上.
  • 如果输出是终端,-q则是默认值.这会将非图形字符打印为"?".否则,-v而且-w是默认的.我-v和它之间的区别有点不清楚-w.我所说的文件-v强制"未经编辑的非图形字符-w打印"并强制"打印不可打印的字符".