Shell Tricks: Detecting if your script is being piped
If you need to check if a shell script is being piped to another program (i.e.
bash yourscript.sh | less
) you can use test -t 1
and friends.
I use this in most scripts that I have that output some kind of color or special formatting. That way if I pipe them to a different program it receives input without any colors.
Suppose you have example.sh
:
#!/usr/bin/env bash
if [[ -t 1 ]]; then
printf "\e[031%s\e[0m\n" "Danger!"
else
echo "Danger!"
fi
If you run bash example.sh
you’ll see “Danger!” in red text. But, if you run
bash example.sh | cat
you’ll see “Danger!” in your default text color.
Note: test
is the same as [
, while Bash/ZSH also have [[
which accepts
the same arguments as test
but adds new behavior. You probably always
want to use [[
unless you’re targeting POSIX sh.