为什么命令“ ls | file”不起作用?

IanC

我一直在研究命令行,并了解到|(管道)旨在将命令的输出重定向到另一个命令的输入。那么,为什么该命令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 **argvint argc参数main()

  • 标准输入stdin是数据流。当某些程序未提供任何命令行参数时,它们会喜欢catwc从stdin中读取内容。在shell脚本中,您可以read用来获取单行输入。在C中,您可以在各种选项中使用scanf()getchar()

file通常不会从stdin读取。它期望至少一个文件名作为参数传递。这就是为什么它在您写时会打印出用法的原因ls | file,因为您没有传递参数。

您可以使用xargs将stdin转换为参数,如中所示ls | xargs file但是,正如terdon所提到的那样,解析ls是一个坏主意。最直接的方法是:

file *

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章