unix 类似GNU的CLI是否应该首先考虑作为arg传递的stdin或file?

wvt8vs2t  于 2023-03-08  发布在  Unix
关注(0)|答案(1)|浏览(166)

我正在设计一个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还是POSIXThis question只是表面上的相似。

gwbalxhn

gwbalxhn1#

常见和TTBOMK通用做法是您的第四种选择:在提供两种输入方法的程序中,如果指定NO文件参数/操作数,它将从标准输入中读取,但如果指定ANY文件参数/操作数,它将只读取指定的文件,而不会自动将标准输入添加到任何地方。由单个连字符组成的文件名是否表示标准输入各不相同;这是常见的,但不是普遍的。
不是所有的程序都提供选择;例如,如果省略文件名,cmp x y将不会从stdin读取,并且tr仅从stdin读取,而不会从命名文件读取。
并非所有程序都以特定顺序读取多个指定文件:cmp - xcmp x -同时读取指定文件和stdin,两者都不“先于”另一个。
在XBD 1.4中的OPERANDS下,隐含了-的可选性,尽管没有指出:“如果命名文件的操作数可以指定为'-',则显式声明[it],这意味着使用[stdin]"。需要显式声明的事实意味着不需要它。
类似地,下一小节(STDIN)提到,对于“许多”实用程序(意味着不是所有),stdin可以“以相同的方式[作为输入文件]”使用,但它没有提到这是一个XOR选择。AFAICT仅为每个实用程序指定,例如您的cat示例:
...如果没有指定文件操作数,将使用标准输入。如果文件是“-”,cat实用程序将从序列中该点的标准输入读取。当以这种方式引用标准输入时,cat实用程序将不关闭和重新打开它,但将接受多次出现的“-”作为文件操作数。
只有在未指定文件操作数或文件操作数为“-”时,才应使用标准输入。
GNU实现更简洁地描述了这一点(着重部分是附加的):
cat复制每个文件(“-”表示标准输入),或标准输入**(如果**未给出...)。

相关问题