Fd 3 связан с /dev/null
в первой строке, поэтому стандартный вывод третьего Echo неизбежно перенаправляется на /dev/null
.
Вместо этого проверьте, присвоен ли Fd 3, проверив существование /proc/self/fd/3
. Если нет, то привяжите его к /dev/null
. Если да, то оставьте его в покое.
[ -e /proc/self/fd/3 ] || exec 3> /dev/null
echo "This is stdout"
echo "This is stderr" >&2
echo "This is fd3" >&3
$./example.sh 3>&1
This is stdout
This is stderr
This is fd3
$./example.sh
This is stdout
This is stderr
Если третье эхо на самом деле представляет собой команду, которая записывает много вывода, более эффективной альтернативой является запуск команды только в том случае, если Fd 3 открыт.
echo "This is stdout"
echo "This is stderr" >&2
[ -e /proc/self/fd/3 ] && echo "This is fd3" >&3
Другая возможность заключается в том, чтобы всегда перенаправлять через Fd 3 в файл или FIFO и читать его, только если вы хотите, в вызывающем процессе, но это также будет означать ненужные штрафы за время, если этот вывод не используется.