I have piped a line in bash script and want to check if the pipe has data, before feeding it to a program.Searching I found about test -t 0 but it doesn't work here. Always returns false.So how to be sure that the pipe has data?Example:echo string | [ -t 0 ] && echo empty || echo fillOutput: fillecho string | tail -n+2 | [ -t 0 ] && echo empty || echo fillOutput: fillUnlike Standard/canonical way to test whether foregoing pipeline produced output? the input needs to be preserved to pass it to the program. This generalizes How to pipe output from one process to another but only execute if the first has output? which focuses on sending email.
Check if pipe is empty and run a command on the data if it isn't
bash;shell;pipe
There's no way to peek at the content of a pipe, nor is there a way to read a character to the pipe then put it back. The only way to know that a pipe has data is to read a byte, and then you have to get that byte to its destination.So do just that: read one byte; if you detect an end of file, then do what you want to do when the input is empty; if you do read a byte then fork what you want to do when the input is not empty, pipe that byte into it, and pipe the rest of the data.first_byte=$(dd bs=1 count=1 2>/dev/null | od -t o1 -A n)if [ -z $first_byte ]; then  # stuff to do if the input is emptyelse  {    printf \\${first_byte# }    cat  } | {    # stuff to do if the input is not empty  }      fiThe ifne utility from Joey Hess's moreutils runs a command if its input is not empty. It usually isn't installed by default, but it should be available or easy to build on most unix variants. If the input is empty, ifne does nothing and returns the status 0, which cannot be distinguished from the command running successfully. If you want to do something if the input is empty, you need to arrange for the command not to return 0, which can be done by having the success case return a distinguishable error status:ifne sh -c 'do_stuff_with_input && exit 255'case $? in  0) echo empty;;  255) echo success;;  *) echo failure;;esactest -t 0 has nothing to do with this; it tests whether standard input is a terminal. It doesn't say anything one way or the other as to whether any input is available.