Không thể nắm bắt đầu ra thành biến trong Bash


15

Gặp rắc rối với redis-cli. Tôi muốn kiểm tra xem kết nối đến rediscó bị từ chối không (thông qua máy chủ), thông qua BASH.

Bài kiểm tra đơn giản

#!/bin/bash
test=$(redis-cli exit) #exit out of the "not connected console"
if [[ -z $test ]] ; then
    echo "I'm empty :("
fi

Tôi dự kiến Could not connect to Redis at 127.0.0.1:6379: Connection refusedsẽ được lưu trữ trong $ test, nhưng văn bản này là đầu ra cho giao diện điều khiển thay thế.

Tôi không chắc chuyện gì đang xảy ra. Ai có ý tưởng gì không?

(Ubuntu 14.04.1)


Lưu ý rằng if [[ -z $test ]]gần như chắc chắn sẽ mở rộng đến if [[ -z ]]khi $testtrở nên trống rỗng, dường như có thể phá vỡ điều kiện. Để bảo vệ chống lại điều này, chỉ cần đặt biến trong dấu ngoặc kép : if [[ -z "$test" ]] ; then.
một CVn

Tôi thực sự nghĩ rằng các phiên bản mới hơn của bash xử lý điều đó. Dường như để làm việc trong các bài kiểm tra của tôi.
DarkNeuron

Vâng sau đó, tốt cho bạn. :-) Tôi có xu hướng thích mạng lưới an toàn bổ sung, nếu không có gì khác để giữ sự tỉnh táo của tôi khi xem mã sau ...
một CVn

Câu trả lời:


20

Đó là bởi vì thông báo lỗi đang được gửi đến luồng STDERR (mô tả tệp 2), chứ không phải STDOUT (mô tả tệp 1) mà bạn đang chụp bằng lệnh thay thế $().

Chỉ tập trung vào việc lấy chuỗi, trên STDOUT hoặc STDERR:

test="$(redis-cli exit 2>&1)"

trong trường hợp đó, [ -z "$test" ]kiểm tra sẽ dẫn đến kết quả dương tính giả vì thông báo lỗi sẽ được lưu trong biến. Thay vào đó bạn có thể làm:

#!/bin/bash
test="$(redis-cli exit 2>/dev/null)"
if [[ -z $test ]] ; then
    echo "I'm empty :("
fi

Ngoài ra tôi nghĩ, điều này sẽ nhận được những gì bạn muốn với trạng thái thoát là tầm thường:

if redis-cli exit &>/dev/null; then
    echo 'Succeeded!!'
else
    echo 'Failed!!'
fi

À, tất nhiên rồi. Đó là một lỗi! :)
DarkNeuron

Ngoài ra, đó là yêu cầu sự cố (nếu chỉ một chút) sử dụng tên của lệnh tích hợp (và có thể thực thi) - "kiểm tra" cho một tên biến, vì vậy chỉ cần kiểm tra trạng thái thoát như trong giải pháp thứ hai là tốt hơn cho lý do đó quá
Joe
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.