2011-11-28 165 views
15

我想用一个bash变量来表示一个文件描述符,这样的:如何使用变量在bash中指示文件描述符?

id=6 
file=a 
exec $id<>$file 

但用法是错误的:

-bash: exec: 6: not found 

那么,如何用一个变量来表示文件描述符在执行命令?

+0

你尝试'$ {ID}'AND/OR'EVAL ....'?祝你好运。 – shellter

+2

@shellter:下一个字符不是单词字符,所以大括号不会帮助。 'eval'看起来是唯一的选择。 –

+0

它可能有助于更新您的问题与您使用的bash版本。祝你好运。 – shellter

回答

10

您必须使用eval并将整个表达式放在引号中。

eval "exec $id<>$file" 

并且每次使用时都要使用$id

+0

感谢您的回答。它真的有效。 –

11

接受的答案是正确的,但as of bash 4.1,你可以使用自动文件描述符分配,并且在这种情况下,你不需要eval

file=a 
exec {id}<>"$file" 

然后你可以使用它像这样:

echo test >&${id} 

或:

fsck -v -f -C ${id} /dev/something 
+0

似乎“代码”必须在代码中修复。有可能使“id”变成一个变量?这将允许更多的灵活性。想象一下,我正在使用像for((FD = 3; FD <100; FD ++));执行exec {FD}> file。$ FD; echo $ FD> &${FD}; done'。这是行不通的,因为'exec {FD}>文件。$ {FD}'将是$ FD的所有值的相同描述符,对吧? –

+1

'id'是一个变量,你可以用'echo $ id'来看它。 –

+0

如果您试图将3到100之间的所有文件描述符重定向到单个文件,那么您应该这样做:'在{3..100}中为fd;做eval“exec $ fd <>文件。$ fd”; echo $ fd> &$fd; done' –