لا يمكنني معرفة سبب خروج نصي Bash الخاص بي بعد رفض الوصول
-
02-10-2019 - |
سؤال
لديّ جزء من البرنامج النصي الذي يقوم بذلك:
- يزيل كل شيء في الدليل
- مزامنة القوة من هذا الدليل
- نسخ ملفات من دليل آخر إلى الدليل المذكور ، هناك بعض الصراعات التي تمنع التحكم في المصدر من الكتابة فوقها (وهو أمر متوقع وما أريد)
قبل أن أحصل على هذا فقط:
...
cp <source path> <dest path>
echo done copying
...
echo done
انتاج:
...
Permission Denied:file1
Permission Denied:file2
done copying
...
done
لذلك ، فإنه سيفعل الأشياء ، والوصول إلى القيام به. بعد ذلك ، ذهبت وأجرت نوعًا من الشيكات للتأكد من خروج الدليل مثل:
if[ -d sourcepath ]
then
if [ -d destpath ]
then
cp <source path> <dest path>
else
echo problem with dest
exit 1
fi
else
problem with source
exit 1
fi
ولكن الآن يخرج البرنامج النصي بعد أن ينكر الإذن الأخير ، وليس ضرب أي شيء بعد ، وبالتالي فإن الناتج مثل هذا:
انتاج:
...
Permission Denied:file1
Permission Denied:file2
أنا لست ذكيًا للغاية في قواعد باش ، لذلك اعتقدت فقط أنني سأقوم بنشر هذا السؤال هنا لأنني لم أتمكن من العثور عليه. يبدو أنه في IF ، على الرغم من أن هناك مشاكل إذن تسبب في خروجها.
المحلول
بخلاف أخطاء بناء الجملة التي يُفترض أنها تم تقديمها أثناء Cut'n'paste هنا ، لا حرج في هذا الرمز ، كما هو موضح في التجربة التالية:
#!/bin/bash
rm -rf sourcepath destpath
mkdir sourcepath
mkdir destpath
touch sourcepath/xyz
touch destpath/xyz
chmod 000 destpath/xyz
if [ -d sourcepath ]
then
if [ -d destpath ]
then
cp sourcepath/xyz destpath/xyz
else
echo problem with dest
exit 1
fi
else
echo problem with source
exit 1
fi
echo Woohoo!
عند التشغيل ، يخرج هذا:
cp: cannot create regular file `destpath/xyz': Permission denied
Woohoo!
لذلك يمكنك أن ترى أنها تستمر بعد الفشل.
جزء واحد من النصائح التي لا تقدر بثمن: عندما تصحح الأخطاء bash
البرامج النصية ، ضع الخط:
set -x
حتى أعلى الجزء العلوي (بعد #!/bin/bash
إذا كان هناك). سيؤدي ذلك إلى إخراج كل أمر قبل تنفيذه.
في الواقع ، أنا دائمًا على صيد البرامج النصية الخاصة بي بدءًا من:
#!/bin/bash
#set -x
لذلك يمكنني فقط إلغاء تحديد السطر الثاني لأغراض تصحيح الأخطاء.
جانبا ، أود أن رمز ذلك على النحو التالي:
if [[ ! -d sourcepath ]] ; then
problem with source
exit 1
fi
if [[ ! -d destpath ]] ; then
problem with dest
exit 1
fi
cp <source path> <dest path>
لكن هذا فقط لأنني لا أحب المعقدة if-then-else
بنيات.
نصائح أخرى
عليك التحقق من أذونات الكتابة
test -w / && echo "writable"
test -w ~ && echo "writable"