Bash - 将值传递给控制台和 variable/file

Bash - Passing value to both console and variable/file

我准备了一个带有功能的简单记录器 logMETHOD:

function logMETHOD {
    exec 5>&1
    local log

    log="$( "$@" 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)。它也是由传递的方法返回的 returns 值。例如

logMETHOD scp test.txt ala@host:/direcotry

它可以工作,但不幸的是我不能使用它,因为我无法访问我需要使用的服务器上的 /dev/fd/5。 "Permission denied".

我尝试使用临时文件而不是文件描述符,但它会破坏动态输出,例如 scp 进度条。

有没有什么方法可以不使用文件描述符来实现这个功能?

您似乎有权使用 &5 但无权使用 /dev/fd/5。您可以尝试通过 运行 ls -l /dev/fd/5 来追查原因,并将其与您的脚本在其下运行的用户+组进行比较。不过,尝试替换可能更简单:

tee /dev/fd/5;

与:

tee >(cat >&5)