`<` 运算符在 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
我不明白的是,<
运算符在这里做什么。有人能解释一下为什么<
运算符在这种情况下会从输出中删除文件名吗?
【问题讨论】:
【参考方案1】:wc
在读取文件时将文件名作为输出的一部分输出。
<
按照“箭头”的方向重定向文件/程序之间的输入和输出。有关 I/O 重定向的更多信息,this 是一个非常方便的链接。文件名被“截断”的原因是wc
在技术上不再从文件中读取。
【讨论】:
wc
正在读取文件,它只是不知道正在读取的文件的名称。
@WilliamPursell 我的印象是重定向输入和输出意味着 wc 只是从它自己的标准输入中读取(现在已修改为文件)而不是直接访问文件,这不正确吗?
wc 正在读取其标准输入。哪个是它直接访问的文件。
@WilliamPursell 你在说什么?
我说的是如果你调用wc < file
,那么进程的标准输入就是文件。 wc
直接访问该文件。该声明有什么令人困惑的地方?编写一个在标准输入上调用fseek
的程序。在调用该程序时,使用<
将文件连接到标准输入。 fseek 将(可能)成功。为什么?因为stdin是文件,程序是直接访问的。【参考方案2】:
在第一种情况下,filename
在调用 wc
时作为参数提供,这会导致 wc
将其包含在输出中。
在第二种情况下,stdin 从filename
重定向,这使得wc
“不知道”该文件,因此无法打印其名称。这相当于调用cat filename | wc -l
。
所以为了回答您的问题,运营商<
重定向输入文件描述符以从给定文件中读取。如果未明确指定描述符编号,则默认为标准输入 (fd 0)。请参阅here for a formal reference 和here for a convenient description。
【讨论】:
<
运算符重定向任何文件描述符输入,如果您不分配文件描述符,则 STDIN 只是默认值。
@123 我很清楚,我指的是OP的问题。
只是你放了operator < redirects the standard input.
这似乎是一个笼统的说法。
说的很中肯,我已将答案修改得更准确。以上是关于`<` 运算符在 shell 中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章