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

标签 linux bash unix

因此,我一直对重定向在以下情况下的工作方式表示怀疑:

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

    test$ touch a b c
    test$ ls
    a b c
    
  2. 我使用“>”将 STDOUT 重定向到一个文件:

    test$ ls > ls.txt
    test$ cat ls.txt 
    a
    b
    c
    ls.txt
    

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

为什么后一种情况的输出与前一种情况的输出不同? ls 真的能看到“>”符号从而改变它的行为吗?

最佳答案

ls 测试它的输出流以查看它是否是一个终端,并根据它修改它的行为。

这是记录在案的; lsman 页面记录了一些取决于输出是否为终端的内容:

  • 如果输出是终端,-C(用于多列输出)是默认值,否则 -1(单列)是默认值。
  • 如果使用 -l-s 并且输出是一个终端,所有文件大小或 block 的总和分别打印在上市。
  • 如果输出是终端,-q 是默认值。这会将非图形字符打印为“?”。否则,-v-w 是默认值。我不太清楚 -v-w 之间的区别。我的文档说 -v 强制“非图形字符的未编辑打印”,-w 强制“非打印字符的原始打印”。

关于linux - 为什么重定向符号会改变 ls 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17997214/

相关文章:

bash - 逻辑运算符可以与 find 和 xargs 一起使用吗?

linux - KornShell (ksh) 重定向

linux - 自定义别名的 Bash cd 命令自动完成

php - echo exec 工作但不执行

linux - 文件输出重定向时没有这样的文件错误

linux - 无法读取 bash 脚本中的第二个参数

c - 用C语言设计 "web app"后端的方法?

c - 通过命名管道发送结构化数据 (Linux)

php - LAMP 堆栈在一个 linux 服务器上使用 apache 和 php,在不同的 linux 服务器上使用 mysql

linux - SuSE - 如何在重新启动后重新启动由用户通过键盘输入启动的 Linux 后台进程