Maarten Bruins
asked on
What the purpose of /dev/tty?
See: https://stackoverflow.com/questions/6170598/can-anyone-explain-to-me-what-the-purpose-of-dev-tty
Let's say my "terminal-file" of the current session is /dev/pts/1. In such a case, then what's the difference between "/dev/pts/1" and "/dev/tty"? And if they are basically the same, then why "/dev/tty" is used instead of "/dev/pts/1"?
And:
Let's say the standard input comes from somewhere else, so let's say we have:
FD 0 <- file
FD 1 -> /dev/pts/1
FD 2 -> /dev/pts/1
How I see it: the fact that the standard input comes from somewhere else doesn't mean that /dev/pts/1 can not be read? The password comes from the keyboard and /dev/pts/1 represents i.a. the keyboard, right? So I still don't see what exactly the purpose is of /dev/tty?
@noci: I know you know the answer, but I don't understand your explanation so I've made this post so maybe other people can explain it to me in a way that I understand it.
You can start with the POSIX spec. From there, read about the "controlling terminal" of a process.
But just for example... /dev/tty is how a command like "ssh" can read your password even if its standard input comes from somewhere else:
tar cf - . | ssh dest 'tar xf -'
If ssh decides to prompt you for a password, it will read it from /dev/tty instead of stdin.
Conceptually, /dev/tty is "the keyboard and text terminal". More or less.
Let's say my "terminal-file" of the current session is /dev/pts/1. In such a case, then what's the difference between "/dev/pts/1" and "/dev/tty"? And if they are basically the same, then why "/dev/tty" is used instead of "/dev/pts/1"?
And:
/dev/tty is how a command like "ssh" can read your password even if its standard input comes from somewhere else
Let's say the standard input comes from somewhere else, so let's say we have:
FD 0 <- file
FD 1 -> /dev/pts/1
FD 2 -> /dev/pts/1
How I see it: the fact that the standard input comes from somewhere else doesn't mean that /dev/pts/1 can not be read? The password comes from the keyboard and /dev/pts/1 represents i.a. the keyboard, right? So I still don't see what exactly the purpose is of /dev/tty?
@noci: I know you know the answer, but I don't understand your explanation so I've made this post so maybe other people can explain it to me in a way that I understand it.
ASKER
Thanks a lot! That's clear to me.
ASKER
Now noci just said something to me in another thread and that confuses me again ;). Let's say the shell is bash. Then I start with a bash process:
FD 0 (standard input) <- /dev/pts/1 (terminal-file/keyboard)
FD 1 (standard output) -> /dev/pts/1 (terminal-file/keyboard)
FD 2 (standard error) -> /dev/pts/1 (terminal-file/keyboard)
When "less" is seen by bash, these file descriptors will be forked first right? Now you're saying:
How I have to see this, because if less starts with a fork of the bash-process then "/dev/pts/1" is known, right?
FD 0 (standard input) <- /dev/pts/1 (terminal-file/keyboard)
FD 1 (standard output) -> /dev/pts/1 (terminal-file/keyboard)
FD 2 (standard error) -> /dev/pts/1 (terminal-file/keyboard)
When "less" is seen by bash, these file descriptors will be forked first right? Now you're saying:
The FD 0 was redirected to the file by the shell before the program started to run,
How I have to see this, because if less starts with a fork of the bash-process then "/dev/pts/1" is known, right?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks a lot! Sounds all logical, I'll go back to noci with it and then later on I'll close this question. What you're saying, totally makes sense to me. I still have to convince noci ;).
So you next question then was...
True, but how do you know that the terminal to read is /dev/pts/1 and not say, /dev/pts/5 or something. The FD 0 was redirected to the file by the shell before the program started to run, so how do you know which terminal to try and read from? You don't, but you can just read from /dev/tty and it will always be whatever FD 0 was going to be before the redirection.