【问题标题】:Shell output redirection inside a function函数内的 Shell 输出重定向
【发布时间】:2010-06-01 19:47:30
【问题描述】:
function grabSourceFile
{
    cd /tmp/lmpsource
    wget $1 >  $LOG
    baseName=$(basename $1)
    tar -xvf $baseName > $LOG
    cd $baseName
}

当我调用这个函数时,捕获的输出不会进入日志文件。在我调用该函数之前,输出重定向工作正常。 $LOG 变量设置在文件的顶部。我尝试回显语句,但它们不会打印。我猜这个函数会捕获输出本身?如果是这样,如何将输出推送到文件而不是控制台。 (上面的 wget 打印到控制台,而函数内部的 echo 什么也不做。)

【问题讨论】:

  • 我不会处理函数内部的输出重定向。使用 exec 在 STDERR/STDOUT 上设置/恢复输出重定向: exec 3>&2 2>/tmp/error.log;做点什么;执行 2>&3;
  • wget $1 > $LOG 会将标准输出重定向到文件中。如果您尝试捕获标准错误,请使用wget $1 2>$LOG,或同时捕获两者,wget $1 > $LOG 2>&1。如果使用得当,stdout 将包含“真实”数据(在wget 的情况下,是下载的数据),而 stderr 将包含错误和状态消息。

标签: linux bash function scope


【解决方案1】:

如前所述,您将两次写入同一个日志文件。您的函数正在记录“wget”的输出,然后稍后使用 tar 命令覆盖该输出。

我自己,我喜欢在函数之外登录。这将减少您的日志文件被破坏的机会。也让功能代码保持整洁。

function grabSourceFile
{
        cd /tmp/lmpsource
        wget $1
        baseName=$(basename $1)
        tar -xvf $baseName
        cd $baseName
} >> $LOG

或者干脆做:

grabSourceFile >> $LOG

【讨论】:

    【解决方案2】:

    重定向在函数内部和外部的工作方式相同。

    您的问题很可能是您想要一个双大于号而不是单个大于号。 IE。 wget $1 >> $LOGtar 命令上的重定向会截断 wget 的输出。

    【讨论】:

    • 为了澄清,>> 附加到文件,而> 覆盖它
    【解决方案3】:

    我发现了问题。它与 wget 一起使用。 wget 有一个专门用于记录的选项,因为我猜它不能使用 > 重定向它的输出(带有诅咒的东西。) 我的工作职能最终是:

    function grabSourceFile
    {
            cd /tmp/lmpsource
            wget -a /tmp/lamps_install.log $1
            baseName=$(basename $1)
            tar -xvf $baseName >> $LOG
            cd $baseName
    }
    

    【讨论】:

    • 我认为您对wget http://www.example.org > tmp/wget.log 不起作用的原因是正确的(对我也不起作用。我正在处理类似的问题)。另请注意,在您的第一个命令中,您使用附加到 $LOG 的 'tar -xvf $baseName > $LOG, which will overwrite $LOG. Your second iteration does >> $LOG`。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2016-03-10
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多