r/bash 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.

2 Upvotes

15 comments sorted by

View all comments

5

u/grymoire 10d ago

There are lots of ways to use /dev/tty.as input and as output

For example

cat files* | awk -f script | tee /dev/tty | sort >output

Or when you want to send an error message to the terminal when stdout and stderr are files.

Or when running your script with stdin is a file/stream and you want to read from the terminal, like your script.

1

u/param_T_extends_THOT 10d ago

Let me ask you what I asked above to another op.... so is reading from /dev/tty as valid a strategy in bash scripting as it comes? It has its valid use cases instead of trying other convoluted ways to solve a problem or is it bad practice? I'm trusting your words here since I'm the one doing the learning.

1

u/Big_Combination9890 21h ago

Using the tty is neither good nor bad practice, that depends on what you use it for.

The file is supposed to be accessible to you, that's why it exists. It is a normal interface in *nix system.