2012-03-19 48 views
46

Tôi có một vấn đề liên quan đến việc lưu trữ đầu ra của một lệnh bên trong một biến trong một tập lệnh bash.
Tôi biết nói chung có hai cách để làm điều nàyĐầu ra lệnh của kịch bản lệnh Bash vào biến

hoặc

foo=$(bar) 
# or 
foo=`bar` 

nhưng đối với phiên bản truy vấn Java, điều này dường như không làm việc.

tôi đã làm:

version=$(java --version) 

này không lưu trữ các giá trị bên trong var. Nó thậm chí vẫn còn in nó, mà thực sự không nên là trường hợp.

Tôi cũng đã thử chuyển hướng đầu ra sang tệp nhưng điều này cũng không thành công.

+0

có hơn hai cách. đọc foo <<(echo "đây là một cách khác") nhưng điều này là không liên quan đến vấn đề của bạn với đánh bắt đầu ra lỗi, trả lời dưới đây rồi. –

Trả lời

56
version=$(java -version 2>&1) 

Thông số phiên bản chỉ mất một dấu gạch ngang và nếu bạn chuyển hướng stderr, tức là nơi thư được ghi vào, bạn sẽ nhận được kết quả mong muốn. Là một sidenote, sử dụng hai dấu gạch ngang là một tiêu chuẩn không chính thức trên Unix như các hệ thống, nhưng vì Java cố gắng gần như giống hệt nhau trên các nền tảng khác nhau, nó vi phạm các kỳ vọng của Unix/Linux và hành xử giống nhau về mặt này như trên các cửa sổ và như tôi nghi ngờ, trên Mac OS.

+0

cảm ơn một tấn, chính xác những gì tôi đang tìm kiếm – user1278282

+0

Làm thế nào để bạn biết nếu đầu ra được viết để stderr hoặc stdout? – user1527227

+2

@ user1527227: Bạn có thể kiểm tra nó. –

14

Đó là vì java -version ghi vào stderr chứ không phải stdout. Bạn nên sử dụng:

version=$(java -version 2>&1) 

Để chuyển hướng stderr đến stdout.

Bạn có thể nhìn thấy nó bằng cách chạy 2 lệnh sau:

java -version > /dev/null 

java -version 2> /dev/null 
+0

cảm ơn vì sự thấu hiểu của bạn, có vẻ như đầu cũng in phiên bản quá cứng nhắc – user1278282

Các vấn đề liên quan