لا يمكنني معرفة سبب خروج نصي Bash الخاص بي بعد رفض الوصول

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

  •  02-10-2019
  •  | 
  •  

سؤال

لديّ جزء من البرنامج النصي الذي يقوم بذلك:

  1. يزيل كل شيء في الدليل
  2. مزامنة القوة من هذا الدليل
  3. نسخ ملفات من دليل آخر إلى الدليل المذكور ، هناك بعض الصراعات التي تمنع التحكم في المصدر من الكتابة فوقها (وهو أمر متوقع وما أريد)

قبل أن أحصل على هذا فقط:

...
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" 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top