What does the `<` operator do in shell?
我在读这个问题,有人试图从shell中获取文件中的行数。从评论中,我看到并实施了以下内容:
1 2 3 4 5
| $ wc -l myfile.txt
30213 myfile.txt
$ wc -l < <filename>
30213 |
我不明白的是,<操作员在这里做什么。有人能解释为什么在这种情况下,<操作符会从输出中删除文件名吗?
wc在读取文件时,将文件名作为输出的一部分输出。
<按照"箭头"的方向重定向文件/程序之间的输入和输出。有关I/O重定向的更多信息,这是一个非常方便的链接。文件名被"切掉"的原因是因为wc在技术上不再从文件中读取。
- wc正在从文件中读取,它只是不知道正在读取的文件的名称。
- @williampursell i给人的印象是,重定向输入和输出意味着wc只是从自己的stdin(现在改为文件)读取,而不是直接访问文件,这是不正确的吗?
- wc正在从它的stdin中读取。它直接访问的文件。
- @你在说什么?
- 我说的是这样一个事实,如果您调用wc < file,那么进程的stdin就是文件。而wc则直接访问该文件。那句话有什么令人困惑的?在stdin上编写一个调用fseek的程序。调用该程序时,使用<将文件连接到stdin。fseek(可能)会成功。为什么?因为stdin是文件,程序直接访问它。
- @123^^见上一条评论。
在第一种情况下,当调用wc时,filename作为参数提供,这会导致wc将其包含在输出中。
在第二种情况下,stdin从filename重定向,这使得wc"不知道"文件,因此无法打印其名称。这相当于调用cat filename | wc -l。
因此,为了回答您的问题,操作员<将输入文件描述符重定向到从给定文件读取。如果没有显式指定描述符编号,那么它默认为标准输入(fd 0)。有关正式参考,请参阅此处,有关方便的描述,请参阅此处。
- <操作符重定向任何文件描述符输入,如果不分配文件描述符,stdin只是默认值。
- @123我很清楚,我指的是OP的问题。
- 只是你把operator < redirects the standard input.放进去了,这看起来像是一个笼统的说法。
- 这是一句公平的话,我把答案修改得更精确了。