AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 410550
Accepted
rubystallion
rubystallion
Asked: 2017-12-13 22:43:56 +0800 CST2017-12-13 22:43:56 +0800 CST 2017-12-13 22:43:56 +0800 CST

管道 ls 是否与 ls -1 相同?

  • 772

ls在几列中返回输出,而返回与我尝试过的目录ls|cat相同的字节输出。ls -1我仍然看到ls -1答案,比如ls -1|wc -l. 有没有理由喜欢ls -1?为什么要...|cat改变输出ls?

shell ls
  • 3 3 个回答
  • 3324 Views

3 个回答

  • Voted
  1. Best Answer
    John1024
    2017-12-13T22:58:17+08:002017-12-13T22:58:17+08:00

    ls测试输出是否到终端。如果输出不去终端,那么-1是默认值。(这可以被 、 或 选项之一-C覆盖-m。-x)

    因此,当ls在管道中使用并且您没有用另一个选项覆盖它时,ls将使用-1. 您可以依赖它,因为 POSIX 需要这种行为

    POSIX 规范

    -1每当输出不进入终端时,POSIX 要求作为默认值:

    POSIX 规范:

    默认格式应为每行列出一个条目到标准输出;例外情况是终端或指定了 -C、-m 或 -x 选项之一时。如果输出到终端,则格式是实现定义的。

    覆盖默认单列格式的这三个选项是:

    -C
    根据整理顺序,使用按列排序的条目写入多文本列输出。文本列数和列分隔符未指定,但应适应输出设备的性质。此选项禁用长格式输出。

    -m
    流输出格式;列出整个页面的路径名,由 <comma> 字符后跟 <space> 字符分隔。使用 <newline> 字符作为列表终止符并在分隔符序列之后,当行上没有空间用于下一个列表条目时。此选项禁用长格式输出。

    -x
    与 -C 相同,不同之处在于生成多文本列输出时条目按列排序,而不是向下排序。此选项禁用长格式输出。

    GNU 文档

    来自GNU ls 手册:

    '-1'
    '--format=single-column'
    每行列出一个文件。当标准输出不是终端时,这是 ls 的默认值。另请参见 -b 和 -q 选项以禁止在文件名中直接输出换行符。[强调补充]

    例子

    让我们创建三个文件:

    $ touch file{1..3}
    

    当输出到终端时,GNUls选择使用多列格式:

    $ ls
    file1  file2  file3
    

    当输出进入管道时,POSIX 规范要求单列是默认值:

    $ ls | cat
    file1
    file2
    file3
    

    覆盖默认单列行为的三个例外是-m用于逗号分隔-C的列、向下排序的列以及-x跨列排序的列:

    $ ls -m | cat
    file1, file2, file3
    $ ls -C | cat
    file1  file2  file3
    $ ls -x | cat
    file1  file2  file3
    
    • 28
  2. G-Man Says 'Reinstate Monica'
    2017-12-13T23:13:46+08:002017-12-13T23:13:46+08:00
    • 为什么管道标准输出会改变 的行为ls?因为它是这样设计的。POSIX 规范说:

      默认格式应为每行列出一个条目到标准输出;例外情况是终端或指定-C、-m或-x选项之一时。如果输出到终端,则格式是实现定义的。

      这实际上对于输出到终端的默认行为(当没有由类似-lor之类的选项指定时)是模棱两可的,并且GNU Coreutils 文档说-1

      如果标准输出是终端,则输出按列(垂直排序),控制字符作为问号输出;否则,输出每行列出一个,控制字符按原样输出。

      所以你可以看到输出到文件的行为与输出到管道的行为相同;也就是说,每行一个条目,就好像-1已经指定了一样。

    • 为什么要这样设计?可能无法确定(除非有人能找到一些设计说明),但我猜:
      • 当ls写入终端时,它期望人类正在查看输出。人们更愿意以最少的必要行数获取信息,因此内容不会滚动屏幕。
      • 当ls写入管道时,它期望另一个程序正在读取输出。程序读取每行一个值的数据比必须尝试解析列要容易得多(因为文件名可以包含空格)。
    • ls -1 当您写入文件或管道时,有没有理由更喜欢?不。
    • 9
  3. caylee
    2017-12-13T22:53:23+08:002017-12-13T22:53:23+08:00

    当管道 ls 时,ls 无法确定控制台实际有多少列(独立于右侧命令)。所以 ls 只是根据自己的选择这样做,或者换句话说,这种行为是不稳定的,并且可能在未来的版本中发生变化。

    相比之下,ls -1一般是为了计数或脚本而创建的,因此它的行为是稳定的。

    • -4

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve