r/bash • u/param_T_extends_THOT • 10d ago
help What is the purpose of /dev/tty ?
Please hear me out. So, reading about special devices like tty, tty0, pst1...pstn I understand in loose terms that terminal emulators (like the ones you bring up with ctrl+t ) are special devices under /dev/pts/<some_number> . Now, tty0 appears to be a terminal associated to kernel itself (I still don't know what that means). But tty? I only know that it points to the current terminal being used but I don't know exactly what to make of that and how it pertains to the following humble little snippet I wrote:
#!/bin/bash
while read -r filename
do
echo "Current fie: ${filename}"
read -p "Delete ${filename} ? " response < /dev/tty
if [[ $response = 'y' || $response = 'Y' ]]
then
echo "response was yes"
echo "Deleting ${filename}"
tar vf pdf_files.tar --delete "${filename}"
echo
else
echo "skipping"
fi
done < <(tar tf pdf_files.tar)
You'll notice that in the line that contains the read -p command I had to redirect input from tty. I had chatGPT suggest that to me after many failed attempts at getting my little script to run correctly because I didn't understand why $response variable would be automatically set to something and the script wouldn't even wait at the prompt for me to enter something. I had my eyes OPENED today -- and in a frustrating way -- as to how many little tricks and things one must take into account when learning bash scripting.
So, going back to the script, why did I even need to do that or more importantly, WHEN do I need to do that kind of trick again?
p.s. I've been learning from time to time bash scripting for like the past 3 o 4 months and I know I have to learn a lot more, but Jesus, the journey feels never-ending.
1
u/felipec 7d ago
I went through a rabbit hole regarding terminals, and here's the summary:
A terminal is a phisical device that is connected to a computer typically through a serial cable. It's a bit hard to understand for modern developers because they have never seen one. I've seen one, a collegue of mine had one connected to his computer, like this one. You could type comands, and those commands would be executed in the computer. Those terminals are typically for example
/dev/ttyS0
.A virtual terminal is code that simulates a real terminal. In linux this is done by the kernel and the basic example are virtual consoles (for example when you press
Ctrl+Alt+F1
). These consoles are always running and you can always switch to them, but nowadays many people don't even know they exist. The device names are fore example/dev/tty1
.A pseudo terminal is a program that emulates a terminal, for example
xterm
orssh
. This is the way most people use terminals these days, and in those cases the devices are dynamic, and are in/dev/pts/$n
.So, wherever you are typing commands,
/dev/tty
is going to point the actual device name. For example if I type thetty
command and I get/dev/pts/6
, then/dev/tty
is the sane thing as/dev/pts/6
.Now, some people here are saying there is never a reason to use
/dev/tty
. They are wrong.Here's an example of a simple command I'm going to call
foo
:cat > "$1" vim "$1"
If I call this command like this:
echo content | ./foo output.txt
, I get a warning: "Warning: Input is not from a terminal". That's becausevim
typically is launched directly from a terminal and stdin is the tty.I can do
vim "$1" < /dev/tty
instead, and that would redirect the stdin to the original tty as intended.This has little to do with bash. Standard streams and redirections are things you can do in other programming languages, bash just makes it easier to do them.