لماذا إعادة توجيه الإخراج تؤثر على نتيجة اختبار في باش?
-
11-12-2019 - |
سؤال
أحاول كتابة برنامج نصي لإطلاق زفس و زبك في جلسات س الخاصة بهم.
للقيام بذلك أنا وضع 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