如何使用变量重定向stdout和stderr?

时间:2017-07-27 07:49:44

标签: bash shell redirect

通常,我们使用

sh script.sh 1>t.log 2>t.err

重定向日志。

如何使用variant进行记录:

string="1>t.log 2>t.err"
sh script.sh $string

3 个答案:

答案 0 :(得分:0)

我找到了一种方法,但它很难看:

echo script.sh $string | sh

答案 1 :(得分:0)

您需要使用' eval' shell内置为此目的。根据{{​​1}}命令的手册页:

bash

运行您的命令,如下所示:

   eval [arg ...]
          The  args are read and concatenated together into a single command.  This command is then read and exe‐
          cuted by the shell, and its exit status is returned as the value of eval.  If there  are  no  args,  or
          only null arguments, eval returns 0.

但是,您真的需要通过eval sh script.sh $string 命令运行script.sh吗?如果您在脚本本身中放置sh解释器行(使用sh作为shell脚本中的第一行)并赋予其执行权限,则可以访问#!/bin/sh的返回码命令。以下是使用ls而不使用sh的示例。注意退出代码的区别。

注意:我当前目录中只有一个文件sh。因此,try.sh命令必须以返回码2退出。

ls

在第二种情况下,退出代码是$ ls try1.sh try1.sh.backup 1>out.txt 2>err.txt $ echo $? 2 $ eval sh ls try1.sh try1.sh.backup 1>out.txt 2>err.txt $ echo $? 127 shell。在第一种情况下,退出代码是sh命令。您需要根据自己的需要做出谨慎的选择。

答案 2 :(得分:0)

我认为您可以将名称放入字符串变量中 然后使用数据重定向

file_name="file1"

outfile="$file_name"".log"
errorfile="$file_name"".err"

sh script.sh 1> $outfile 2> $errorfile