2012-10-01 43 views
6

Khi tôi cố gắng tham chiếu đến hai ống thay thế quy trình trong một hàm bash, chỉ có tác phẩm được tham chiếu đầu tiên. Điều thứ hai đưa ra một "mô tả tập tin xấu" lỗi như vậy:Bash thay thế quá trình kép cho bộ mô tả tập tin sai

$ foo(){ 
> cat "$1" 
> cat "$2" 
> } 
$ foo <(echo hi) <(echo bye) 
hi 
cat: /dev/fd/62: Bad file descriptor 
$ 

Dường như các đường ống thứ hai được giảm một lần một được tham chiếu, nhưng a) Tôi dường như không thể xác nhận hành vi này trong bất kỳ tài liệu và b) Tôi ước nó sẽ không. =)

Bất kỳ ý tưởng nào về những gì tôi đang làm sai? FWIW Tôi đang làm điều này để tạo ra một trình bao bọc để sử dụng công cụ khác biệt đồ họa FileMerge của Mac OS X thay vì dòng lệnh, đã sẵn sàng làm việc với nhiều đường ống từ dòng lệnh.

-Rob

Trả lời

2

Bạn có chắc là bạn đang chạy nó bằng bash chứ không phải một số trình bao khác? Bạn đã kiểm tra đầu ra của echo $SHELL chưa?

trình tốt cho tôi sử dụng bash:

[16:03:51][[email protected](1)]:~ 
(0)$function foo() { cat "$1"; cat "$2"; }; 
[16:03:59][[email protected](1)]:~ 
(0)$foo <(echo "lva") <(echo hi) 
lva 
hi 

Khi tôi thay đổi công việc để #/bin/dash ví dụ tôi nhận lỗi.

Hãy thử đặt #!/Bin/bash làm hình ảnh trên dòng đầu tiên của tập lệnh.

+0

Đó không phải là một câu trả lời ... Tôi vừa kiểm tra - nó hoạt động trên Linux và không hoạt động trên OSX, mà dường như là nền tảng của OP. –

4

/bin/bash được cung cấp cùng OSX (3.2.48) không thành công. Một từ macports (4.2.37 - bình thường /opt/local/bin/bash nếu bạn đã cài đặt) hoạt động tốt. Cho dù đó là phiên bản hoặc xây dựng tôi không biết. Có lẽ bạn có thể muốn sử dụng macports bash cho tập lệnh này. Một chắc chắn phải có macports trên mỗi mac, vì vậy tôi giả sử bạn làm ;-)

+0

Vâng, macports bash đã sửa nó cho tôi. Tôi sẽ cập nhật thông tin đăng nhập đầu cuối của mình. Cảm ơn! – rharder

5

Trước tiên, tôi nghĩ @Michael Krelin là đúng về việc này liên quan đến phiên bản bash được cung cấp với OS X (v3.2.48). Có vẻ từ thử nghiệm của tôi như thể mô tả tập tin bị loại bỏ sau khi lệnh bên ngoài đầu tiên chức năng thực hiện:

$ bar() { echo "Args: $*"; echo "First ext command:"; ls /dev/fd; echo "Second ext command:"; ls /dev/fd; } 
$ bar <(echo hi) <(echo bye) 
Args: /dev/fd/63 /dev/fd/62 
First ext command: 
0 1 2 3 4 5 6 62 63 
Second ext command: 
0 1 2 3 4 5 6 

Lưu ý rằng/dev/fd/62 và 63 biến mất giữa hai ls danh sách. Tôi nghĩ rằng tôi tìm thấy một workaround, mặc dù: sao chép của fd mong manh đến không mong manh fd trước khi chúng có cơ hội để biến mất:

$ baz() { exec 3<"$1" 4<"$2"; ls /dev/fd; ls /dev/fd; cat /dev/fd/3; cat /dev/fd/4; } 
$ baz <(echo hi) <(echo bye) 
0 1 2 3 4 5 6 62 63 
0 1 2 3 4 5 6 
hi 
bye 
+0

giải pháp tuyệt vời. Có, xin lỗi không được chỉ định, nhưng hành vi kỳ lạ là trên OS X 10.8. Tôi nhận thấy hành vi kỳ quặc này cũng không xảy ra trong Cygwin. Tôi có thể sẽ chuyển sang macports bash, nếu nó hoạt động "đúng". – rharder

+0

+1 để giải quyết sự cố. Hoàn toàn không thực tế, nhưng mát mẻ ;-) –