命令行参数(例如“some.text”)实际传递到哪里?

命令行参数(例如“some.text”)实际传递到哪里?

据我所知,传递给命令的参数会传递到它的 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.

相关内容