Перенаправление не является командой.
|
создает новую команду, потому что не только вывод предыдущей команды, «переданной по трубопроводу» где-то еще, но также и другая команда выполняется на этом выходе. Например,
ls | grep 'abc'
выйдет из 1, если ничто не соответствует этому шаблону, независимо от того, успешно ли ls
выполнено или нет). Статус выхода, который вы видите с помощью $?
, является статусом последнего канала.
Перенаправление не то же самое, потому что оно не передает выходные данные следующей команде в строке, просто в файл. Обратите внимание, что перенаправление может заставить вас вернуть 1, если ваша команда иначе сработала бы, потому что у вас нет прав на запись в файл. В этом случае ваша команда не будет выполнена.
TL; DR: для выполнения команды требуется допустимое перенаправление. Если он может работать, статусом выхода будет статус выхода команды. Состояние выхода перенаправления - ИЛИ команды, и перенаправление (0 ИЛИ 1, 1 ИЛИ 1, 1 ИЛИ 0 все возвратит 1; только успешное перенаправление и успешная команда возвращают 0)