I wrote this following piece of bash script.

if [ $(tmux has -t junk) ]
echo zero
echo one

It always returns one, no matter if the session exists or not. I checked in the command line by executing the tmux statement and then running $? . It behaves as expected, zero if session exists and one if session does not exists Why isn't if statement is not behaving the same way. I tried changing the if statement like below

tmux has -t junk
if [ $? -eq 0 ]
echo zero
echo one

The above thing works. So whats wrong with the first statement block ?

2 Answers 2


As mentioned if [ $(tmux has -t junk) ] expand to to if [ ] which evaluates to false.

You could use:

if tmux has -t junk; then
    echo OK
    echo ERR

Or if you want the shorter:

tmux has -t junk || echo ERR


tmux has -t junk && echo OK || echo ERR

You can also negate it if that is more suitable, as in:

! tmux has -t junk || echo OK
! tmux has -t junk && echo ERR || echo OK


Also not that if a command produces output you might want to redirect that output to the black hole of /dev/null as in:

 if my_cmd >/dev/null; then echo OK else; echo ERR; fi

If the command produces textual error you'd might want to redirect standard error as well by:

 if my_cmd >/dev/null 2>&1; then echo OK else; echo ERR; fi

This, what follows, you might already know well, but add it for a bit more completeness.

As mentioned: $? is the only way to get the return value of the program.

Some programs vary return and can have a rather explicit meaning.

So e.g.:


case "$ecode" in
0) echo "Success";;
1) echo "Operation not permitted";;
2) echo "No such file or directory";;

By this one can take appropriate action on specific errors.

If you have MySQL installed you can do e.g. this by perror:

for i in {0..50}; do perror $i; done
# And
for i in {1000..1050}; do perror $i; done

to get a feel for it.

See also this answer related to OS specific errors which also links to Open Groups doc Error Numbers and errno.h.

Or take a look at SQLite and its extended ones.

  • Wow if tmux ... works! thanks. I understand if [ cmd ] expands to output of cmd. How if cmd work ?
    – bagavadhar
    Apr 12, 2013 at 6:07
  • @ashwin: Not sure I get what you ask. But if cmd has any output that would result in test being performed on that output. [ is a command with ] as last parameter. In turn that would most probably result in an error depending on output. Say the cmd prints *Blah blah\n some info\n more blah* all of that would be the test expression. You might want to look at the answers here.
    – Runium
    Apr 12, 2013 at 6:30
  • @ashwin: Note e.g. comment on this answer on the [ test command.
    – Runium
    Apr 12, 2013 at 6:35

When you use:

if [ $(tmux has -t junk) ]

This checks the output of the command tmux has -t junk but not the return value.

So since it is always printing one as in the first case, this means that tmux has -t junk command is not printing anything on the standard output.

So in first case,

if [ $(tmux has -t junk) ] 

is getting evalauted as

if [ ]
  • How to check for return value ? Is $? the only way ?
    – bagavadhar
    Apr 12, 2013 at 4:50
  • Yes, $? is the only way to find out the return value. Apr 12, 2013 at 4:58

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .