这是一个检查标准输入源的脚本,
来自 How-to Geek:“Linux 上的标准输入、标准输出和标准错误是什么?”
https://www.howtogeek.com/435903/what-are-stdin-stdout-and-stderr-on-linux/
#!/bin/bash
if [ -t 0 ]; then
echo stdin coming from keyboard
else
echo stdin coming from a pipe or a file
fi
那么如果使用参数或命令替换执行任何命令,它是否与stdin
?在这种情况下,是stdin
空的吗?
虽然我可以理解stdin
来自管道或文件的含义,但stdin
来自键盘的含义是什么?它是一种类似于键入read
命令或此处文档的键吗?
感谢社区每天的支持。
command line arguments
揭开和之间的区别的神秘面纱stdin
。我将把我的答案分成多个部分来解释下层概念。然后回答你的问题。在我开始解释之前,请记住以下几点:
标准输入和命令行参数
标准输入是 Linux 的一个文件,程序可以访问它以获取用户的输入。任何程序都不能直接与 Keyboard 交互,而是与
stdin
. 因此,如果程序需要从用户那里获取输入,它将访问stdin
.当您将重定向 (
> or <
) 或管道 (|
) 与其他命令一起使用时,它会操纵输入和输出流,即stdin
和stdout
. 当您指定这些特殊字符时,它们会指示它们stdin
以及stdout
如何运行。在 Linux 中,stdin
是/proc/self/fd/0
和stdout
是/proc/self/fd/1
命令行参数基本上是一种从使用中获取输入以及调用命令以使命令执行某些特定任务的方法。不需要每个程序都有命令行参数,因为使用它们取决于以下程序的开发人员。
命令行参数作为数组传递给命令。(数组是一种数据结构,由一组元素组成,每个元素至少由一个数组索引或键标识。)。因此,程序员可以使用该数组中的值向他们的程序添加更多功能。
C 程序示例
在上述程序中,该程序不接受用户的任何标准输入,但它确实接受命令行参数,并且根据是否提供参数而工作不同。
argc
是一个变量,它存储传递的参数计数,并且argv
是一个数组,它存储调用程序时传递的参数。argv[0]
是数组中包含程序本身名称的第一个元素。之后该数组将包含传递的参数。当我通过键入“./batman”执行以下程序时,我得到以下输出:
但是当我通过键入“./batman Bruce”来执行相同的程序时。我得到:
现在这并不意味着这个程序不能接受输入。下面是修改后的程序,它接受命令行参数和标准输入。
以上采用命令行参数,然后等待用户通过标准输入输入密码。
如果我们不指定任何参数,它将像之前的 C 代码一样抛出错误。
下面是程序执行时的输出:
在传递命令行参数后,该程序等待用户输入的密码,因此通过
stdin
那么结论是什么?
我希望你理解我上面解释的概念。现在是时候回答这些问题了。stdin
在stdin
这种情况下只是指向您的输入设备但没有被使用。stdin
is 本身就是一个文件,它默认指向您的输入设备并从那里获取输入。但是,当您在命令中提供管道或重定向时,它会告诉您stdin
从您指定的文件中获取输入,而不是从连接到您计算机的输入设备中获取输入。如果你不懂 C 程序也没关系。这次让我们使用内置命令而不是定制程序。
命令而不是程序的示例:
输出将是相同的,因为相应的开发人员
cat
要么从文件中读取数据,要么stdin
从文件中读取数据,文件的名称作为第一个命令行参数(它是 shell 传递给 cat 的数组中的第一个元素)给出。随后 cat 将 file_name 的全部内容或写入
stdin
终端,因为我们不指示 shell 操作stdout
. 请记住,在第二行中,您的 shellstdin
以这种方式进行操作,它不再指向您的标准输入设备,而是指向您当前工作目录中名为 file_name 的文件。这个例子取自另一篇文章,你可以点击这里阅读更多我希望这不仅可以为您提供问题的解决方案,还可以帮助您理解基本概念。