我正在设计一个CLI,它应该以两种方式接受输入:
1.来自标准输入:cat in_stdin.csv | csv2parquet -o out.parquet
1.从作为显式参数csv2parquet in1.csv in2.csv -o out.parquet
传递的一个或多个文件
现在问题出现了,当用户尝试使用两种方式给出输入时,如何处理这种情况:
cat in_stdin.csv | csv2parquet in1.csv in2.csv -o out.parquet
对于有经验的开发人员期望处理这些输入的顺序,是否有一个强或弱的约定?让我们假设这个CLI希望按照GNU/POSIX准则来操作。
例如,假设in1.csv
将被认为在in2.csv
之前出现是合理的。
但是我没有一个清晰的直觉,in_stdin.csv
应该出现在in1.csv
之前还是in2.csv
之后。第三种选择是,这种混合输入通常是被避免的,因此应该被禁止。
第四种选择是不隐式地接受stdin
,而是要求将其指定为/dev/stdin
或-
,这将是最通用的解决方案,因为它将允许用户指定任意顺序,例如使stdin
出现在中间:一米一米一。
我试着四处阅读,但找不到明确的指导方针,无论是GNU还是POSIX。This question只是表面上的相似。
1条答案
按热度按时间gwbalxhn1#
常见和TTBOMK通用做法是您的第四种选择:在提供两种输入方法的程序中,如果指定NO文件参数/操作数,它将从标准输入中读取,但如果指定ANY文件参数/操作数,它将只读取指定的文件,而不会自动将标准输入添加到任何地方。由单个连字符组成的文件名是否表示标准输入各不相同;这是常见的,但不是普遍的。
不是所有的程序都提供选择;例如,如果省略文件名,
cmp x y
将不会从stdin读取,并且tr
仅从stdin读取,而不会从命名文件读取。并非所有程序都以特定顺序读取多个指定文件:
cmp - x
或cmp x -
同时读取指定文件和stdin,两者都不“先于”另一个。在XBD 1.4中的OPERANDS下,隐含了
-
的可选性,尽管没有指出:“如果命名文件的操作数可以指定为'-',则显式声明[it],这意味着使用[stdin]"。需要显式声明的事实意味着不需要它。类似地,下一小节(STDIN)提到,对于“许多”实用程序(意味着不是所有),stdin可以“以相同的方式[作为输入文件]”使用,但它没有提到这是一个XOR选择。AFAICT仅为每个实用程序指定,例如您的
cat
示例:...如果没有指定文件操作数,将使用标准输入。如果文件是“-”,cat实用程序将从序列中该点的标准输入读取。当以这种方式引用标准输入时,cat实用程序将不关闭和重新打开它,但将接受多次出现的“-”作为文件操作数。
只有在未指定文件操作数或文件操作数为“-”时,才应使用标准输入。
GNU实现更简洁地描述了这一点(着重部分是附加的):
cat复制每个文件(“-”表示标准输入),或标准输入**(如果**未给出...)。