it-swarm.asia

تجاهل أخطاء محددة في برنامج شل

لدي قصاصة صغيرة من نص شل الذي لديه القدرة على رمي العديد من الأخطاء. لدي البرنامج النصي المعين حاليًا للتوقف عن جميع الأخطاء على مستوى العالم. ومع ذلك أود لهذا القسم الفرعي صغير يختلف قليلا.

هنا هو مقتطف:

recover database using backup controlfile until cancel || true; 
auto

أتوقع أن يرمي هذا في النهاية خطأ "لم يتم العثور على الملف". ومع ذلك أود متابعة التنفيذ على هذا الخطأ. لأي خطأ آخر ، أود إيقاف البرنامج النصي.

ما هي أفضل طريقة لتحقيق ذلك؟

باش النسخة 3.00.16

46
Stunt

لمنع bash من تجاهل الخطأ لأوامر محددة ، يمكنك قول:

some-arbitrary-command || true

هذا سيجعل البرنامج النصي متابعة. على سبيل المثال ، إذا كان لديك البرنامج النصي التالي:

$ cat foo
set -e
echo 1
some-arbitrary-command || true
echo 2

تنفيذ ذلك سيعود:

$ bash foo
1
z: line 3: some-arbitrary-command: command not found
2

في غياب || true في سطر الأوامر ، أنتجت:

$ bash foo
1
z: line 3: some-arbitrary-command: command not found

اقتباس من دليل :

لا يتم إنهاء Shell إذا كان الأمر الذي فشل هو جزء من قائمة الأوامر بعد كلمة while أو until مباشرةً ، جزء من الاختبار في عبارة if ، جزء من أي أمر ينفذ في && أو || قائمة ما عدا الأمر التالي النهائي && أو || ، أي أمر في خط أنابيب ولكن الأخير ، أو إذا كانت حالة الإرجاع للقلب مقلوبة بـ !. يتم تنفيذ فخ على ERR ، إذا تم تعيينه ، قبل خروج Shell.

تحرير: من أجل تغيير السلوك بحيث يجب تنفيذ في التنفيذ فقط إذا تنفيذ some-arbitrary-command عاد file not found كجزء من الخطأ ، يمكنك القول:

[[ $(some-arbitrary-command 2>&1) =~ "file not found" ]]

كمثال ، قم بتنفيذ ما يلي (لا يوجد ملف باسم MissingFile.txt موجود):

$ cat foo 
#!/bin/bash
set -u
set -e
foo() {
  rm MissingFile.txt
}
echo 1
[[ $(foo 2>&1) =~ "No such file" ]]
echo 2
$(foo)
echo 3

هذا ينتج المخرجات التالية:

$ bash foo 
1
2
rm: cannot remove `MissingFile.txt': No such file or directory

لاحظ أن echo 2 أعدم لكن echo 3 لم يكن.

98
devnull

استعمال:

command || :

: هو باش المدمج في أن يعود دائما النجاح. وكما نوقش أعلاه ، || دوائر قصيرة بحيث يتم تنفيذ RHS فقط في حالة فشل LHS (إرجاع غير الصفر).

ستعمل الاقتراحات أعلاه لاستخدام "صواب" أيضًا ، ولكنها غير فعالة لأن "صواب" هو برنامج خارجي.

21
Chris Cogdon