لماذا إعادة توجيه الإخراج تؤثر على نتيجة اختبار في باش?

StackOverflow https://stackoverflow.com//questions/12651750

سؤال

أحاول كتابة برنامج نصي لإطلاق زفس و زبك في جلسات س الخاصة بهم.

للقيام بذلك أنا وضع DISPLAY القيمة ، تشغيل أول واحد في الخلفية والانتظار حتى أحصل على عائد ناجح من xset q.ثم أغير DISPLAY وتفعل الشيء نفسه بالنسبة للآخر.

أنا أكتب هذه القطعة قطعة للتحقق لقد حصلت على بناء الجملة الصحيح لكل جزء والجزء أنا عالقة على هو ' الانتظار حتى أحصل على عائد ناجح من xset q.

export DISPLAY=":0.0"
while [[ ! `xset q` ]]
do
  echo -n "."
done

يبدو أن هذا الرمز للعمل حتى عندما شفس تشغيله يخرج على الفور وعندما لا يجلس هناك الطباعة .xset: unable to open display ":0.0"

ومع ذلك لا أريد أن أرى إخراج xset لذلك أنا أحاول إعادة توجيه انتاجها.

export DISPLAY=":0.0"
while [[ ! `xset q > /dev/null 2>&1` ]]
do
  echo -n "."
done

إضافة هذا إعادة التوجيه ولكن يبدو لكسر الكشف ، وبغض النظر عما إذا كان زفس قيد التشغيل أم لا يجلس فقط هناك نقاط الطباعة.

لقد اختبرت الأمرين من تلقاء نفسها وفي النصي قذيفة من تلقاء نفسها كلاهما العمل كما أتوقع ، والعودة 1 عندما زفس لا يعمل و 0 عندما يكون.

يمكن لأي شخص أن يفسر لماذا وضع هذا الأمر داخل [[ ! `…` ]] يكسر while اختبار وكيف يمكنني إعادة كتابة هذا while حلقة بشكل صحيح?

(يعمل على القوس)

هل كانت مفيدة؟

المحلول

المشكلة هي أنك لا تختبر رمز الإرجاع xset على الإطلاق ، يمكنك معالجة الإخراج.عند إعادة توجيه الإخراج إلى /dev/null, ، التعبير في باكستكس لا يعود أي شيء ، كما لو كان لديك:

while [[ ! '' ]] ...

والتي سوف تعمل دائما while الجسم.

ما يجب أن تفعله هو:

while ! xset q > /dev/null 2>&1 
do 
  ...
done
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top