2011-11-28 213 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' –