ملف البرنامج النصي مقابل سطر الأوامر:rsync و-استبعاد

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

  •  21-08-2019
  •  | 
  •  

سؤال

لدي برنامج نصي بسيط لاختبار bash والذي يبدو كما يلي:

#!/bin/bash

cmd="rsync -rv --exclude '*~' ./dir ./new"
$cmd # execute command

عندما أقوم بتشغيل البرنامج النصي فإنه سيتم أيضًا نسخ الملفات التي تنتهي بـ ~ على الرغم من أنني قصدت استبعادهم.عندما أقوم بتشغيل نفس أمر rsync مباشرة من سطر الأوامر، فإنه يعمل!هل يعرف أحد لماذا وكيف يعمل البرنامج النصي bash؟

راجع للشغل، وأنا أعلم أنه يمكنني أيضا العمل مع --exclude-from لكني أريد أن أعرف كيف يعمل هذا على أي حال.

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

المحلول

وحاول على وحدة التقييم : ل

#!/bin/bash

cmd="rsync -rv --exclude '*~' ./dir ./new"
eval $cmd # execute command

نصائح أخرى

والمشكلة ليست ان كنت تعمل في السيناريو، فهو أن كنت وضعت الأمر في متغير ثم قم بتشغيل متغير الموسعة. ومنذ يحدث توسع متغير بعد أن تم بالفعل إزالة الاقتباس وعلامات الاقتباس المفردة حول بك استبعاد نمط لم تحصل على إزالة ... والرياح رسينك حتى تصل باستثناء الملفات ذات الأسماء التي تبدأ بحرف 'وتنتهي مع ~. لحل هذه المشكلة، فقط إزالة علامات الاقتباس حول نمط (كل شيء موجود بالفعل في المزدوج ونقلت وحتى لا تكون هناك حاجة إليها):

#!/bin/bash

cmd="rsync -rv --exclude *~ ./dir ./new"
$cmd # execute command

... من الذي يتكلم، لماذا أنت تضع الأمر في متغير قبل تشغيله؟ بشكل عام، وهذا هو وسيلة جيدة تجعل رمز أكثر مربكة مما يجب أن يكون، والشذوذ الزناد إعراب (بعض حتى أغرب من هذا). فكيف:

#!/bin/bash

rsync -rv --exclude '*~' ./dir ./new

يمكنك استخدام بسيط --eclude '~' كـ (الترميز إلى صفحة الرجل):

  • إذا بدأ النمط بـ A / ثم يتم ترسيخه إلى بقعة معينة في التسلسل الهرمي للملفات ، وإلا فإنه يتطابق مع نهاية اسم المسار.هذا مشابه لقيادة ^ في التعبيرات العادية.وبالتالي فإن "/foo" سوف يتطابق مع اسم "Foo" إما في "جذر النقل" (للقاعدة العالمية) أو في دليل ملف الدمج (لقاعدة كل دليل).ستطابق "Foo" غير المؤهلة اسم "Foo" في أي مكان في الشجرة لأن الخوارزمية يتم تطبيقها بشكل متكرر من أعلى إلى أسفل ؛يتصرف كما لو أن كل مكون مسار يحصل على منعطف في نهاية اسم الملف.حتى "Sub/Foo" غير المصممة ستتطابق في أي وقت من المرحلة من التسلسل الهرمي حيث تم العثور على "foo" داخل دليل يدعى "Sub".راجع القسم الخاص بالرسو يتضمن/استبعاد أنماط لمناقشة كاملة حول كيفية تحديد نمط يتطابق مع جذر النقل.
  • إذا انتهى النمط بـ A / بعد ذلك ، فسيتطابق مع دليل فقط ، وليس ملفًا منتظمًا أو مرفقًا أو جهازًا.
  • تختار RSYNC بين إجراء مطابقة للسلسلة البسيطة ومطابقة البطاقة البرية عن طريق التحقق مما إذا كان النمط يحتوي على واحدة من هذه الأحرف الثلاثة البرية:'*'، '؟'، و '[' .
  • يتطابق "*" مع أي مكون مسار، لكنه يتوقف عند الخطوط المائلة.
  • استخدم "**" لمطابقة أي شيء، بما في ذلك الخطوط المائلة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top