有时标准输入(stdin)是一个终端:
$ tty
/dev/pts/0
有时不是:
$ echo hello | tty
not a tty
$ tty < /dev/null
not a tty
$ tty << eof
> hello
> eof
not a tty
当“stdin”不是终端时,它是什么? “not a tty”组是否有一个集体名称,或者它们只是单独引用?
答案1
它可以是一个文件(甚至是设备文件或 FIFO)或管道。
区别很重要,因为与常规打开的文件相比,您可以通过更多方式在控制终端上进行操作。有时这是有利的,有时则是不利的。
例如,您无法重定向终端。您可以重定向 stdin,但这不会影响从 tty 的读取。程序经常从 tty 读取密码。这可能很好,因为它不会干扰您希望命令从标准输入读取的数据,但如果您想编写命令脚本(并且需要例如expect
或socat
来处理终端),这可能会很糟糕。
但是,即使进程没有连接到标准输入,它仍然有一个控制 tty。
答案2
那些是重定向:
因此,您可以说“是重定向”,而不是“不是 tty”。将文件重定向到命令:
command < filename
Here Documents - 这种类型的重定向指示 shell 从当前源读取输入,直到看到仅包含单词(没有尾随空格)的行:
<<[-]word
here-document
delimiter
将 commandA 的 stdout 重定向到 commandB:
commandA | commandB