Поведение оператора return в функциях bash

У меня проблемы с пониманием поведения встроенной функции return в bash. Вот пример сценария.

#!/bin/bash

dostuff() {
    date | while true; do
        echo returning 0
        return 0
        echo really-notreached
    done

    echo notreached
    return 3
}

dostuff
echo returncode: $?

Результатом этого сценария является:

returning 0
notreached
returncode: 3

Если, однако, дата | удалить из строки 4, результат будет таким, как я ожидал:

returning 0
returncode: 0

Кажется как и оператор return , использованный выше, действует так, как я думал, что оператор break должен вести себя, но только тогда, когда цикл находится на правой стороне канала. Почему это так? Я не мог найти ничего, что могло бы объяснить такое поведение на странице руководства bash или в Интернете. Скрипт действует одинаково в bash 4.1.5 и dash 0.5.5.

19
задан A B 18 August 2011 в 15:09
поделиться