【问题标题】:bash: how to redirect stdin/stderr then later revert fd's?bash:如何重定向标准输入/标准错误,然后再恢复 fd?
【发布时间】:2011-04-27 17:51:19
【问题描述】:

我想要一个脚本来将标准输入和标准错误重定向到一个文件,做很多事情,然后撤消这些重定向并对文件内容采取行动。我正在尝试:

function redirect(){
   exec 3>&1
   exec 4>&2
   exec 1>outfile 2>&1
}
function undirect(){
   exec 1>&3
   exec 2>&4
}
echo first
redirect
echo something
cat kjkk
undirect
if some_predicate outfile; then echo ERROR; fi

这似乎可以满足我的要求,但似乎相当复杂。有没有更清洁/更清晰的方法来做到这一点?

【问题讨论】:

    标签: bash redirect descriptor


    【解决方案1】:

    如果您真的需要来回切换它,而事先不知道什么会在何时何地发生,这几乎就是这样做的方法。根据您的要求,尽管隔离需要重定向的部分并将它们作为组执行可能会更整洁,如下所示:

    echo first
    {
      echo something
      cat kjkk
    } 1>outfile 2>&1
    if some_predicate outfile; then echo ERROR; fi
    

    {} 被称为组命令,整个组的输出被重定向。如果您愿意,您可以在子外壳中执行您的操作,因为它只影响子外壳。

    echo first
    (
      exec 1>outfile 2>&1
    
      echo something
      cat kjkk
    )
    if some_predicate outfile; then echo ERROR; fi
    

    请注意,我在这里使用括号 (),而不是大括号 {}(在第一个示例中使用)。

    HTH

    【讨论】:

    • 甚至在当前shell中:{ echo something; cat afile; } >outfile 2>&1
    • @glenn;对。第一个可能是这样,可能也更好..我会编辑
    【解决方案2】:

    对我来说似乎很干净。我唯一要做的就是将“outfile”名称作为参数传递给函数,因为您在函数之外使用文件名

    redirect() {
        exec 3>&1
        exec 4>&2
        exec 1>"$1" 2>&1
    }
    :
    redirect outfile
    :
    if some_predicate outfile; ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多