2011-11-28 7 views
15

Tôi muốn sử dụng một biến bash để chỉ một bộ mô tả tập tin, như thế này:Làm thế nào để sử dụng một biến để chỉ ra một mô tả tập tin trong bash?

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

Nhưng việc sử dụng là sai:

-bash: exec: 6: not found 

Vì vậy, làm thế nào để sử dụng một biến để chỉ ra một mô tả tập tin trong lệnh exec?

+0

bạn đã thử '$ {id}' VÀ/hOẶC 'eval .... '? Chúc may mắn. – shellter

+2

@shellter: Ký tự tiếp theo không phải là ký tự từ, do đó dấu ngoặc nhọn sẽ không giúp ích gì. 'eval' trông giống như tùy chọn duy nhất. –

+0

Nó có thể giúp cập nhật câu hỏi của bạn với phiên bản bash bạn đang sử dụng. Chúc may mắn. – shellter

Trả lời

10

Bạn phải sử dụng eval và đặt toàn bộ biểu thức trong dấu ngoặc kép.

eval "exec $id<>$file" 

Và làm điều đó mỗi khi bạn muốn sử dụng $id.

+0

Cảm ơn câu trả lời của bạn. Nó thực sự hiệu quả. –

11

Câu trả lời được chấp nhận là đúng, nhưng as of bash 4.1, bạn có thể sử dụng phân bổ mô tả tập tin tự động, và trong trường hợp đó bạn không cần phải eval:

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

Sau đó, bạn có thể sử dụng nó như thế này:

echo test >&${id} 

hay:

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

Có vẻ như "id" phải được sửa trong mã. Có thể biến "id" thành một biến không? Điều này sẽ cho phép linh hoạt hơn. Hãy tưởng tượng tôi đang sử dụng một mã như 'for ((FD = 3; FD <100; FD ++)); tập tin exec {FD}> $ FD; echo $ FD> &${FD}; done'. Điều này sẽ không hoạt động, vì tệp 'exec {FD}>. $ {FD}' sẽ là cùng một bộ mô tả trên tất cả các giá trị của $ FD, phải không? –

+1

'id' là một biến, bạn có thể thấy nó với' echo $ id'. –

+0

Nếu bạn đang cố gắng chuyển hướng tất cả các mô tả tập tin giữa 3 và 100 cho các tệp riêng lẻ thì bạn sẽ làm như sau: 'for fd in {3..100}; làm eval "exec $ fd <> file. $ fd"; echo $ fd> &$fd; done' –