`<` 运算符在 shell 中的作用是啥?

Posted

技术标签:

【中文标题】`<` 运算符在 shell 中的作用是啥?【英文标题】: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; 运算符在这种情况下会从输出中删除文件名吗?

【问题讨论】:

【参考方案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 reference 和here for a convenient description。

【讨论】:

&lt; 运算符重定向任何文件描述符输入,如果您不分配文件描述符,则 STDIN 只是默认值。 @123 我很清楚,我指的是OP的问题。 只是你放了operator &lt; redirects the standard input.这似乎是一个笼统的说法。 说的很中肯,我已将答案修改得更准确。

以上是关于`<` 运算符在 shell 中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

<> 运算符在 Slick 中的作用是啥?

运算符 |= 在 JavaScript 中的作用是啥?

|= 运算符在 Java 中的作用是啥?

波浪线(波浪线)(即“~”运算符在 Python 中的作用是啥? [复制]

扩展运算符在此 javascript 代码中的作用是啥?

C++:cout和cin 标识符的含义是啥?他们后面分别使用啥运算符?各运算符的作用是啥?