There are some problems cmd1 || $(($?==253 ? true : false) && cmd2:
- A )is missing afterfalse.
- You don't want $(( ... ))but(( ... )). The former would execute the result of the expression (that is a number!) as a command. The latter just evaluates the expression and fails if the result is 0 and succeeds otherwise. Note that is the opposite of how exit codes work.
- trueand- falseare not commands here, but variables. If an undefined variable is used inside- (( ... ))its value is always 0. Therefore the command- ((... ? true : false))always fails.
Here is want you could have written instead:
cmd1 || (($?==253 ? 1 : 0)) && cmd2
Test:
prompt$ true || (($?==253 ? 1 : 0)) && echo ok
ok
prompt$ false  || (($?==253 ? 1 : 0)) && echo ok
prompt$ ( exit 253; )  || (($?==253 ? 1 : 0)) && echo ok
ok
However, the ternary operator isn't really needed here. The following would be equivalent:
cmd1 || (($?==253)) && cmd2
Despite that, an if would probably be better. If you don't want to use one inline, you can write a function for that:
# allow all exit codes given as the first argument
# multiple exit codes can be comma separated 
allow() {
   ok=",$1,"
   shift
   "$@"
   [[ "$ok" = *,$?,*  ]]
}
allow 0,253 cmd1 && cmd2
Or define a wrapper just for this one command
cmd1() {
    command cmd1 "$@" || (( $? == 253 ))
}
cmd1 && cmd2