【问题标题】:command line to read from stdin or file从标准输入或文件读取的命令行
【发布时间】:2017-04-06 20:57:19
【问题描述】:

我有一个这样运行的命令:

$ cmd <file_name> [option]

[option] 是可选的,命令可以从stdin 读取。所以下面的命令是可以的:

$ cmd file
$ cmd file option
$ cat file | cmd

但是,使用 [option]stdin 读取会出错:

$ cat file | cmd option
Cannot open file: option

那么如何构造命令,或者我必须更改程序以正确读取stdin

谢谢。

【问题讨论】:

  • 不接受文件名作为参数。仅解析命令行以获取选项。如果用户想从文件中读取,他们可以重定向cmd option &lt; file
  • 能看到cmd的代码吗?
  • 典型的模式是“选项”先出现,并用破折号标记,然后是参数(即“cat -v 文件”或“ls -lh dir”)您可能想要看看“man getopt”。
  • option 是一个简单的标志或一组单个值(如 Y/N 或红色/绿色/蓝色/黑色)?或者是一组选项(如-d -f -t等)?如果是后者,您能否添加一个选项来控制您的脚本是查找文件还是从标准输入获取输入? (请注意,这在很大程度上取决于文件/标准输入的使用位置以及数据的外观。如果您可以分享 cmd 实际在做什么,我们可能会提供更多帮助。
  • 这只是一个单值选项。无论如何,正如@WilliamPursell 所说,只是做了一个快速修复。将寻找其他人建议的其他选项。谢谢大家。

标签: linux shell unix command-line


【解决方案1】:
  1. bash(以及kshzshyash 等shell)中,有process substitution,它将管道的输出变成ad hoc em> /dev/fd/ 目录下的临时文件:

    cmd <(cat file) option
    
  2. 作为R. Sinasohn comments,类似/dev/stdin 的东西可能会起作用:

    cat file | cmd /dev/stdin option
    

如果命令依赖于文件的可写性或具有适当的元数据,这些方法将无法令人满意:

# No editors:
sed -i 's/a/A/' <(echo abcd)
sed: couldn't edit /dev/fd/63: not a regular file

# whatever `file` does won't work.
file <(echo abcd)
/dev/fd/63: broken symbolic link to pipe:[15331948]

# file size not the same as data size.
ls -Hlog <(echo abcd)
prw------- 1 0 Apr  6 23:27 /dev/fd/63

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2014-12-16
    • 2014-05-27
    • 2018-04-06
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多