2015-09-15 2 views
3

Я подготовил простой регистратор с функцией logMETHOD:Bash - Передача значение как для консоли и переменной/файл

function logMETHOD { 
    exec 5>&1 
    local log 

    log="$("[email protected]" 2>&1 | tee /dev/fd/5; echo ${PIPESTATUS[0]}>/tmp/ssg_retval)" 
    local retVal=$(</tmp/ssg_retval) 
    rm -f /tmp/ssg_retval 

    _LOG_SSG+=$log$'\n' 
    return $retVal 
} 

Это здорово. Он помещает вывод переданного метода в консоль (через /dev/fd/5) и переменную log (через /dev/fd/1) одновременно. Он также возвращает значение, возвращаемое переданным методом. Например.

logMETHOD scp test.txt [email protected]:/direcotry 

Это работает, но, к сожалению, я не могу использовать его, потому что у меня нет доступа к /dev/fd/5 на сервере мне нужно использовать. "Доступ запрещен".

Я попытался использовать временный файл вместо файлового дескриптора, но он разбивает динамический вывод, например, scp индикатор выполнения.

Есть ли способ реализовать эту функциональность без использования дескрипторов файлов?

ответ

3

похоже, что у вас есть разрешение на использование &5, но не для использования /dev/fd/5. Вы можете попытаться проследить, почему, запустив ls -l /dev/fd/5 и сравнив это с группой пользователя +, с которой работает ваш скрипт. Это может быть проще, хотя, просто попробуйте заменить:

tee /dev/fd/5; 

С:

tee >(cat >&5) 
+1

Работает идеально. Спасибо! – aerion