据我所知,传递给命令的参数会传递到它的 STDIN 流。
所以这:
cut -d. -f2 'some.text'
应该与此完全相同:
echo 'some.text' | cut -d. -f2
当我们发送some.text
到 STDIN 时。在第一种情况下通过参数,在第二种情况下通过管道。
some.text
如果不是 STDIN,第一个样本中的参数会去哪里?
答案1
不,通过命令行传递的参数不会自动传递到 STDIN,而是以单独的变量形式提供给程序,然后程序可以根据需要解释它们。这些变量通常称为 argc 和 argv。
许多 Unix 工具(cut、head、tail、cat 等)可以通过 STDIN 或通过命令行中的文件获取输入。
所以echo 'some.text' | cut -d. -f2
效果与
echo 'some.text' > temporary_file
cut -d. -f2 temporary_file
rm temporary_file
答案2
命令行参数和程序输入根本不等同。它们并不走相同的路线,并且有不同的解释。
该命令cut
将开头的参数解释-
为选项,将其他参数解释为输入文件名(与许多其他命令一样)。
参数通过以下方式传递给程序execve
系统调用。这环境是在它旁边通过的。程序可以从内存中的某个位置读取其参数;编程语言通常提供变量或函数来访问参数,例如C中argv
的参数main
。
标准输入是文件描述符0. 按照惯例,这是程序可以读取的预先打开的文件。当您在终端上运行命令而不重定向其输入时,标准输入来自终端(即您键入的内容)。当您使用 重定向文件中的输入时mycommand <input_file
,标准输入将连接到该文件。当您在管道中运行命令时command1 | command2
, 的标准输入command2
会连接到 的标准输入command2
。
答案3
STDIN 和程序命令(包括参数)是完全不同的东西。 STDIN 是程序可以读取的文件。它可能连接到终端、磁盘文件、设备、套接字等。程序命令只是一组字符串,第一个字符串是程序的名称。它们作为参数传递给程序的main()
函数。
答案4
如果您指的是命令行参数(例如,-d
-f2
, 和第一个示例中的'some.text'
),它们都会转到关联的程序。
命令行参数还可能包含指定输出去向或输入来自何处的信息。例如,在第一个示例中,文件名的存在表明数据来自文件,而在第二个示例中,缺少文件名意味着数据来自stdin
.在这两种情况下,输出都会转到stdout
.