বাশ-এ ভেরিয়েবলের আউটপুট ক্যাপচার করতে পারে না


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$ পরীক্ষায় সঞ্চিত হওয়ার প্রত্যাশা করব , তবে এই পাঠ্যটি কনসোলের পরিবর্তে আউটপুট।

আমি নিশ্চিত না কি চলছে। কারো কোন ধারণা আছে?

(উবুন্টু 14.04.1)


নোট করুন যে if [[ -z $test ]]প্রায় অবশ্যই খালি হয়ে if [[ -z ]]গেলে প্রসারিত হবে $testযা শর্তসাপেক্ষে ভেঙে যাওয়ার সম্ভাবনা রয়েছে। এই বিরুদ্ধে রক্ষা করার জন্য, কেবল উদ্ধৃতির মধ্যে পরিবর্তনশীল করা: if [[ -z "$test" ]] ; then
একটি সিভিএন

আমি আসলে মনে করি বাশের নতুন সংস্করণগুলি হ্যান্ডেল করে। যাইহোক আমার পরীক্ষাগুলিতে কাজ করার জন্য মনে হচ্ছে।
ডার্কনিউরন

ঠিক আছে, তাহলে আপনার জন্য ভাল। :-) আমি অতিরিক্ত সুরক্ষা নেট পছন্দ করি, যদি পরে কোডটি দেখার সময় আমার বিচক্ষণতা রক্ষা না করে ...
একটি সিভিএন

উত্তর:


20

এটি কারণ যে ত্রুটি বার্তাটি STDERR স্ট্রিমে পাঠানো হচ্ছে (ফাইল বর্ণনাকারী 2), STDOUT নয় (ফাইল বর্ণনাকারী 1) যা আপনি কমান্ড প্রতিস্থাপনের সাথে ক্যাপচার করছেন $()

স্ট্রিংটি অর্জনের দিকে মনোযোগ কেন্দ্রীভূত করুন 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

আহ, অবশ্যই এটি একটি ত্রুটি! :)
ডার্কনিউরন

এছাড়াও, এটি একটি ভেরিয়েবল নামের জন্য একটি অন্তর্নির্মিত কমান্ডের (এবং এক্সিকিউটেবল) - "পরীক্ষা" নাম ব্যবহার করতে সমস্যা (যদি কেবলমাত্র কিছুটা হলেও) জিজ্ঞাসা করে, সুতরাং দ্বিতীয় সমাধানের মতোই প্রস্থান স্থিতি পরীক্ষা করা আরও ভাল is যে কারণও।
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.