Câu trả lời:
Lệnh thường gửi thông tin đó đến STDERR, không phải STDOUT. Vì vậy, trong trường hợp của bạn, bạn nên sử dụng các lệnh như:
java -version >>version.txt 2>&1
và
var=$((java -version) 2>&1)
Như Romeo đã chỉ, java -version
viết bằng stderr , không phải trong stdout , vì vậy bạn nên sử dụng:
var=$(java -version 2>&1)
Nếu bạn muốn chỉ nhận phiên bản và không phải tất cả đầu ra của java -version
lệnh, ví dụ thuận tiện hơn cho kịch bản, bạn có thể sử dụng một cái gì đó như:
var=$(java -version 2>&1 | awk -F '"' 'NR==1 {print $2}')
java -version
in thông điệp phiên bản java vào stderr2>&1
chuyển hướng stderr đến stdout|
nhận đầu ra lệnh lefthand và sử dụng nó làm đầu vào cho lệnh tay phảiawk -F '"' 'NR==1 {print $2}'
phức tạp hơn một chút, nhưng về cơ bản, nó phân chia đầu vào mà nó nhận được thành các phần, cho phép bạn hoạt động với từng phần riêng biệt (những người hiểu biết nhất có thể sẽ ném tôi đến những con sư tử, đó là một bản tóm tắt rất tệ về những gì và awk làm gì ).
awk
lấy phân chia được chỉ định bởi -F
tùy chọn, trong trường hợp này, nó được chia cho ký tự"
{print $2}
) từ dòng đầu tiên ( NR==1
) của phân chia kết quả phải được in.Điều này sẽ tạo ra một cái gì đó như 1.8.0_191
.
java -version
: chúng không cần thiết và gọi thêm một nhánh con nữa.