Как в BASH работают логические операторы?
Как всегда, в заголовке "Как в работают логические операторы?", а на самом деле вопрос "почему код ошибки 0 интерпретируется как true". "Где логика, где разум?" :)

В то время как озвученный вопрос и на самом деле интересный. 
Так работают логические операторы не только в баше. В РНР точно так же можно написать true /*false*/ and print "Success" or print "Failed"; и получать тот же самый результат. 
Суть тут в том, что логические операторы делаются "ленивыми". Они не вычисляют тот операнд, который не влияет на конечный результат.
Соответственно:
если операция вернула true, то мы должны выполнить тот операнд, который стоит после and, потому что иначе не сможем получить общий результат операции and. который будет true только если оба операнда вернули true
если операция вернула true, то нет смысла выполнять тот операнд, который стоит после or, поскольку его результат ни на что не повлияет - итоговый результат в любом случае будет true, поскольку для or важно чтобы истинным был только один результат. получаем "Success"
если операция вернула false, то нам не нужно выполнять тот операнд, который стоит после and, потому что в любом случае результатом будет false
если операция вернула false, то мы должны выполнить тот операнд, который стоит после or, поскольку он будет определяющим для всего выражения. получаем "Failed"

Так как успешное выполнение команды возвращает 0. Что полностью противоречит алгебре логики.
Потому что вы зачем-то отождествляете код статуса с булевой переменной, а это неправильно - он может принимать различные значения.

Всё это легко гуглится, короче.