【问题标题】:does pipe operator modify its input/output? Or is ls aware of pipe?管道运算符是否修改其输入/输出?还是 ls 知道管道?
【发布时间】:2014-04-01 18:57:16
【问题描述】:

考虑以下...当我在没有任何标志的情况下执行“ls”时,它会在一行中返回结果,如下所示:

me@myComp /cygdrive/c/test/
$ ls
folder1/  folder2/  folder3/

现在,如果我想 grep 某些结果的结果,比如“2”,我会得到以下信息:

me@myComp /cygdrive/c/test/
$ ls | grep 2
folder2/

它不应该返回整行吗?我希望这个结果我使用了ls -l | grep 2

在我看来,管道操作员正在以某种方式将输入更改为 grep,或者 ls 以某种方式知道管道并更改了自己的输出。

folder1/ folder2/ folder3/ 是一个字符串,不是吗?那么 grep 怎么知道只返回 folder2/ 而不是 folder1/ folder2/ folder3/

【问题讨论】:

  • 我自己早就想知道这一点。 ls 似乎确实知道它的输出将进入管道,因此将每个结果格式化为单独的行。如果输出到终端,它的格式会更紧凑。我不知道这是“官方”行为,还是只是惯例。

标签: linux bash grep pipe ls


【解决方案1】:

参见ls 的手册页,即标志-1

-1(数字“一”。)强制输出为每个条目 线。 这是不输出到终端时的默认设置。

如果你想强制多列输出使用

-C 强制多列输出;这是输出时的默认值 一个终端。

所以要回答你的问题,是的,ls知道输出的去向,并且它具有明确定义的行为,具体取决于你可以轻松覆盖的行为。

【讨论】:

  • 非常有趣...我也发现了这一点,这也解释了how ls is pipe aware。似乎它正在使用 isatty 来测试文件描述符并根据它写入的内容来改变它的输出——这让我想知道它是如何在 cygwin 上工作的:P
  • 想必ls的cygwin实现不一样吧。 POSIX 标准要求每行一个文件,除非有一个选项明确地改变了这一点,或者如果输出到终端(在这种情况下,输出是实现定义的)。
猜你喜欢
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2016-04-27
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 2022-07-31
相关资源
最近更新 更多