我的脚本按照以下方式执行子 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 中使用。