【问题标题】:What does the `<` operator do in shell?`<` 运算符在 shell 中的作用是什么?
【发布时间】:2018-06-12 12:11:36
【问题描述】:

我正在阅读此question,其中有人试图从 shell 获取文件中的行数。从 cmets 中,我看到并实现了以下内容:

$ wc -l myfile.txt
30213 myfile.txt

$ wc -l < <filename>
30213

我不明白的是,&lt; 运算符在这里做什么。有人能解释一下为什么&lt; 运算符在这种情况下会从输出中删除文件名吗?

【问题讨论】:

    标签: shell


    【解决方案1】:

    wc 在读取文件时将文件名作为输出的一部分输出。

    &lt; 按照“箭头”的方向重定向文件/程序之间的输入和输出。有关 I/O 重定向的更多信息,this 是一个非常方便的链接。文件名被“截断”的原因是wc 在技术上不再从文件中读取。

    【讨论】:

    • wc 正在读取文件,它只是不知道正在读取的文件的名称。
    • @WilliamPursell 我的印象是重定向输入和输出意味着 wc 只是从它自己的标准输入中读取(现在已修改为文件)而不是直接访问文件,这不正确吗?
    • wc 正在读取其标准输入。哪个是它直接访问的文件。
    • @WilliamPursell 你在说什么?
    • 我说的是如果你调用wc &lt; file,那么进程的标准输入就是文件。 wc 直接访问该文件。该声明有什么令人困惑的地方?编写一个在标准输入上调用fseek 的程序。在调用该程序时,使用&lt; 将文件连接到标准输入。 fseek 将(可能)成功。为什么?因为stdin是文件,程序是直接访问的。
    【解决方案2】:

    在第一种情况下,filename 在调用 wc 时作为参数提供,这会导致 wc 将其包含在输出中。

    在第二种情况下,stdin 从filename 重定向,这使得wc“不知道”该文件,因此无法打印其名称。这相当于调用cat filename | wc -l

    所以为了回答您的问题,运营商&lt; 重定向输入文件描述符以从给定文件中读取。如果未明确指定描述符编号,则默认为标准输入 (fd 0)。请参阅here for a formal referencehere for a convenient description

    【讨论】:

    • &lt; 运算符重定向任何文件描述符输入,如果您不分配文件描述符,则 STDIN 只是默认值。
    • @123 我很清楚,我指的是OP的问题。
    • 只是你放了operator &lt; redirects the standard input.这似乎是一个笼统的说法。
    • 说的很中肯,我已将答案修改得更准确。
    猜你喜欢
    • 2012-06-27
    • 2013-12-03
    • 2010-11-28
    • 2016-06-20
    • 2020-05-25
    • 2012-10-03
    • 2011-01-20
    • 2015-12-20
    相关资源
    最近更新 更多