我一直在研究命令行,并了解到|
(管道)旨在将命令的输出重定向到另一个命令的输入。那么,为什么该命令ls | file
不起作用?
file
输入是其他文件名之一,例如 file filename1 filename2
ls
输出是文件夹中目录和文件的列表,因此我认为ls | file
应该显示文件夹中每个文件的文件类型。
但是,当我使用它时,输出为:
Usage: file [-bcEhikLlNnprsvz0] [--apple] [--mime-encoding] [--mime-type]
[-e testname] [-F separator] [-f namefile] [-m magicfiles] file ...
file -C [-m magicfiles]
file [--help]
由于该file
命令的使用存在一些错误
根本问题是file
期望文件名作为命令行参数,而不是stdin。当您写入时,ls | file
的输出ls
将作为输入传递给file
。不作为参数,作为输入。
有什么不同?
命令行参数是当您在命令后写入标志和文件名时的命令,例如cmd arg1 arg2 arg3
。在shell脚本这些参数可以作为变量$1
,$2
,$3
,等在C你会通过访问它们char **argv
和int argc
参数main()
。
标准输入stdin是数据流。当某些程序未提供任何命令行参数时,它们会喜欢cat
或wc
从stdin中读取内容。在shell脚本中,您可以read
用来获取单行输入。在C中,您可以在各种选项中使用scanf()
或getchar()
。
file
通常不会从stdin读取。它期望至少一个文件名作为参数传递。这就是为什么它在您写时会打印出用法的原因ls | file
,因为您没有传递参数。
您可以使用xargs
将stdin转换为参数,如中所示ls | xargs file
。但是,正如terdon所提到的那样,解析ls
是一个坏主意。最直接的方法是:
file *
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句