Lưu trữ $ (java -version) vào một biến bash


0

Tại sao khi tôi làm điều này: $ var=$(java -version)trên thiết bị đầu cuối bash của tôi, varluôn trống? Điều tương tự $ java -version >> version.txtkhông có gì được gửi đến tệp version.txt.

Câu trả lời:


3

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

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

1
Tôi không biết lý do tại sao bạn đặt vòng ngoặc trong java -version: chúng không cần thiết và gọi thêm một nhánh con nữa.
AFH

3

Như Romeo đã chỉ, java -versionviế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 -versionlệ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}')

Giải trình

  1. java -versionin thông điệp phiên bản java vào stderr
  2. 2>&1chuyển hướng stderr đến stdout
  3. | nhận đầu ra lệnh lefthand và sử dụng nó làm đầu vào cho lệnh tay phải
  4. awk -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ì ).
    • Ký tự awklấy phân chia được chỉ định bởi -Ftùy chọn, trong trường hợp này, nó được chia cho ký tự"
    • Phần cuối cùng chỉ định rằng chỉ phần tử thứ hai ( {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.


1
Cảm ơn đã giải thích. Tôi tự hỏi tại sao Java sử dụng STDERR thay vì STDOUT và làm thế nào để bạn biết điều này?
akuma8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.