I'm trying to ensure that a script I write only runs in a terminal window. If it's not in a terminal, I want the script to sleep for 3 seconds and then exit. I've read about using the $SHLVL environment variable, where I think a value greater than 1 indicates it's running in an interactive terminal. However, I'm not entirely sure this is the best approach or if there are more reliable methods. Here's a rough idea of what I've come up with:
If $SHLVL > 1 then
Echo running in terminal
Echo continuing
Elif $SHLVL <= 1 then
Sleep 3
Exit
Else
Echo how is this even possible?
Fi
I can't test it right now because I'm on a road trip and using my phone, but I'm looking for feedback on this approach before I try it out at home.
2 Answers
Definitely consider using the `tty` command as mentioned. It’s a straightforward way to check if the output is connected to a terminal. Just make sure to include proper error handling in your script for any unexpected situations, like if someone tries running it in a non-interactive environment. That way, you can give a user-friendly message instead of just exiting.
Using $SHLVL can be tricky because it might not always be reliable for checking if your script is running in a terminal. A better way to do this is to use the `tty` command, which checks if the standard output is attached to a terminal. You can use this in your script like this:
if [ -t 1 ]; then
echo "Running in terminal"
# Continue with your script
else
echo "Not in terminal, sleeping for 3 seconds"
sleep 3
exit
fi
This way, you don't have to worry about the shell's level, and it directly checks the terminal status. Give it a try!

Got it, thanks! I'll try out the `tty` command instead and see if it works better for my setup.