Bash에서 변수로 출력을 캡처 할 수 없습니다


15

에 문제가 redis-cli있습니다. redisBASH를 통해 연결 이 거부 되었는지 (서버 다운) 확인하고 싶습니다 .

간단한 테스트

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

Could not connect to Redis at 127.0.0.1:6379: Connection refused$ test에 저장 될 것으로 예상 되지만이 텍스트는 대신 콘솔에 출력됩니다.

무슨 일인지 잘 모르겠습니다. 누구든지 아이디어가 있습니까?

(우분투 14.04.1)


참고 if [[ -z $test ]]거의 확실으로 확장 할 if [[ -z ]]$test조건을 깰 가능성이 보인다, 빈됩니다. 이를 방지하려면 변수를 따옴표로 묶으십시오 if [[ -z "$test" ]] ; then.
CVn

실제로 최신 버전의 bash가 처리한다고 생각합니다. 어쨌든 내 테스트에서 작동하는 것 같습니다.
DarkNeuron

그럼 당신에게 좋습니다. :-) 나중에 추가 코드를 볼 때 제 정신을 보존 할 수있는 추가 안전망이없는 경우가 있습니다.
CVn

답변:


20

명령 대체로 캡처하는 STDOUT (파일 설명자 1)이 아니라 오류 메시지가 STDERR 스트림 (파일 설명자 2)으로 전송되기 때문 $()입니다.

STDOUT 또는 STDERR에서 문자열을 얻는 데 중점을 둡니다.

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

이 경우 [ -z "$test" ]오류 메시지가 변수에 저장되므로 테스트 결과 오 탐지가 발생합니다. 대신 당신은 할 수 있습니다 :

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

또한 종료 상태가 사소한 경우 원하는 것을 얻을 수 있다고 생각합니다.

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

아 물론 이죠 오류입니다! :)
DarkNeuron

또한 내장 명령 (및 실행 파일)의 이름-변수 이름에 "test"라는 이름을 사용하는 데 어려움이 있습니다 (두 번째 솔루션에서와 같이 종료 상태를 테스트하는 것이 좋습니다) 그 이유도 있습니다.
Joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.