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


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.