变量的子 Shell 重定向错误 ( while .... ) $3 > $testdir/$testfile.log

变量的子 Shell 重定向错误 ( while .... ) $3 > $testdir/$testfile.log

我的脚本按照以下方式执行子 shell 命令:

 ( while ..... ) $3>$testdir/$testfile.log

我收到错误:

line 75: syntax error near unexpected token `$3'
line 75: `    ) $3>$testdir/$testfile.log'

我尝试了几种选择,似乎>只有当它是硬编码数字而不是变量时才高兴。我是不是少了一个括号?

答案1

你是对的,shell 语法只允许类似的东西

`#>'

其中#是一位数。

shell 可能支持多位数,但 POSIX 未指定该行为。

能够在这里进行变量扩展将远远超出指定的语法。

但是,您可以使用eval扩展文本,然后再次调用解析器。

答案2

Shell 语法受到限制:重定向只能由紧邻重定向运算符之前的一位数字表示。不能有多个数字、中间空格或由变量扩展产生的数字。

如果变量中有文件描述符编号,则可以将eval其拼接到执行重定向的 shell 代码片段中。为了避免将大部分脚本放入eval字符串中,请使用exec内置函数来执行重定向。例如,如果这是带有硬编码文件描述符编号的代码

( … ) 3>foo

那么您可以使用此代码重定向到变量指示的文件描述符fd

( eval "exec $fd>foo"; … )

1您只能在某些支持此扩展的 shell 中使用。

相关内容