xargs
xargs (اختصارًا لـ "الوسائط الموسعة") [ 1 ] هو أمر في أنظمة يونكس ومعظم أنظمة التشغيل الشبيهة بيونكس يُستخدم لإنشاء وتنفيذ الأوامر من المدخلات القياسية . يقوم بتحويل المدخلات من المدخلات القياسية إلى وسائط للأمر.
بعض الأوامر، مثل ` grepxargs` و`xargs`، awkتقبل المدخلات إما كوسائط سطر الأوامر أو من المدخلات القياسية. بينما أوامر أخرى، مثل ` cpxargs` و`xargs` echo، تقبل المدخلات فقط على شكل وسائط، ولذلك فإن استخدام `xargs` ضروري.
تتوفر نسخة مُعدّلة من إصدار قديم من GNU xargs لنظام التشغيل Microsoft Windows كجزء من مجموعة UnxUtils، وهي عبارة عن نسخ Win32 أصلية لأدوات GNU Unix الشائعة. [ 2 ] وتُعدّ نسخة wargs المُعاد كتابتها بالكامل جزءًا من مشروع TextTools مفتوح المصدر . [ 3 ] كما تمّت أيضًا ترجمة أمر xargs إلى نظام التشغيل IBM i . [ 4 ]
أمثلة
يُستخدم الأمر xargs أحيانًا لحذف قائمة من الملفات باستخدام الأمر rm . تحتوي أنظمة POSIX على ARG_MAX لتحديد الحد الأقصى لطول سطر الأوامر، [ 5 ] [ 6 ] لذا قد يفشل الأمر مع ظهور رسالة خطأ "قائمة الوسائط طويلة جدًا" ( أي تجاوز الحد المسموح به لطول سطر الأوامر في استدعاء النظام exec). (الاستدعاء الأخير غير صحيح، لأنه قد يؤدي إلى توسيع أنماط glob في المخرجات).rm/path/*rm$(find/path-typef)
يمكن إعادة كتابة هذا باستخدام xargsالأمر لتقسيم قائمة الوسائط إلى قوائم فرعية صغيرة بما يكفي لتكون مقبولة:
$ find /path -type f -print | xargs rm في المثال أعلاه، تقوم findالأداة بتغذية المدخلات xargsبقائمة طويلة من أسماء الملفات، xargsثم تقسم هذه القائمة إلى قوائم فرعية وتستدعي الدالة rmمرة واحدة لكل قائمة فرعية.
يمكن استخدام بعض تطبيقات xargs-P maxprocs لتنفيذ العمليات بالتوازي باستخدام الوسيطة لتحديد عدد العمليات المتوازية اللازمة لتنفيذ الأوامر على قوائم وسائط الإدخال. مع ذلك، قد لا تكون تدفقات الإخراج متزامنة. يمكن التغلب على هذه المشكلة باستخدام وسيطة --output fileعند الإمكان، ثم دمج النتائج بعد المعالجة. المثال التالي يُرتب 24 عملية في قائمة انتظار وينتظر انتهاء كل منها قبل بدء عملية أخرى.
$ find /path -name '*.foo' | xargs -P 24 -I '{}' /cpu/bound/process '{}' -o '{}' .out غالبًا ما يغطي xargs نفس وظائف ميزة استبدال الأوامر في العديد من الصدفات ، والتي يُشار إليها بعلامة الاقتباس المائلة ( `...`أو $(...)). يُعد xargs أيضًا رفيقًا جيدًا للأوامر التي تُخرج قوائم طويلة من الملفات مثل find`.org` locateو` .org` grep، ولكن فقط في حال استخدام -0`.org` (أو ما يُعادله --null)، لأن ` .org` xargsبدون -0`.org` يتعامل بشكل سيئ مع أسماء الملفات التي تحتوي على '` .org` "و`.org` ومسافة. GNU Parallel أداة مشابهة تُوفر توافقًا أفضل مع `find` و` locate` و` grep` عندما قد تحتوي أسماء الملفات على '` ".org` و`.org` ومسافة (لا يزال سطر جديد مطلوبًا -0).
ترتيب الحجج
-Iالخيار: وسيط واحد
يُتيح الأمر xargs خيارات لإدراج الوسائط المُدرجة في موضع آخر غير نهاية سطر الأوامر. يأخذ -Iالخيار xargs سلسلة نصية تُستبدل بالمدخلات المُقدمة قبل تنفيذ الأمر. ومن الخيارات الشائعة %.
$ mkdir ~/backups $ find /path -type f -name '*~' -print0 | xargs -0 -I % cp -a % ~/backups قد يظهر النص المراد استبداله عدة مرات في جزء الأمر. استخدام الأمر -Iat all يحد من عدد الأسطر المستخدمة في كل مرة إلى سطر واحد.
خدعة الصدفة: أي رقم
هناك طريقة أخرى لتحقيق تأثير مماثل وهي استخدام shell كأمر يتم تشغيله، والتعامل مع التعقيد الموجود في هذا shell، على سبيل المثال:
$ mkdir ~/backups $ find /path -type f -name '*~' -print0 | xargs -0 sh -c 'for filename; do cp -a "$filename" ~/backups; done' sh الكلمة shالموجودة في نهاية السطر مخصصة ليملأها نظام POSIX بدلاً من "اسم الملف التنفيذي" ضمن المعاملات الموضعية (argv). في حال عدم وجودها، سيتم تعيين اسم أول ملف مطابق بدلاً من ذلك، ولن يتم نسخ الملف إلى . يمكن أيضاً استخدام أي كلمة أخرى لملء هذا الفراغ، على سبيل المثال.sh -c$0$0~/backupsmy-xargs-script
بما أن cpالبرنامج يقبل ملفات متعددة في وقت واحد، يمكن للمرء أيضًا القيام بما يلي ببساطة:
$ find /path -type f -name '*~' -print0 | xargs -0 sh -c 'if [ $# -gt 0 ]; then cp -a "$@" ~/backup; fi' sh يتم تشغيل هذا البرنامج النصي cpمع جميع الملفات المُعطاة له عند تمرير أي وسائط. يُعدّ هذا أكثر كفاءة، حيث cpيتم استدعاء البرنامج مرة واحدة فقط لكل استدعاء للبرنامج sh.
مشكلة الفاصل
تعتمد العديد من أدوات يونكس على تنسيق الأسطر. قد تعمل هذه الأدوات xargsطالما لا تحتوي الأسطر على فاصلة 'أو "مسافة. يمكن لبعض أدوات يونكس استخدام NUL كفاصل للسجلات (مثل بيرل (التي تتطلب استخدام -0فاصلة بدلاً \0من فاصلة \n)، locateو(التي تتطلب استخدام فاصلة -0)، و(التي تتطلب استخدام فاصلة)، و ( التي تتطلب findاستخدام فاصلة أو فاصلة) ، و(التي تتطلب استخدام فاصلة )). استخدام فاصلة يحل المشكلة، لكن العديد من أدوات يونكس لا يمكنها استخدام NUL كفاصل (مثل فاصلة ، وفاصلة، وفاصلة، وفاصلة ، وفاصلة ) .-print0grep-z-Zsort-z-0xargsheadtaillsechosedtar -vwcwhich
لكن غالباً ما ينسى الناس هذا ويفترضون xargsأنه موجه نحو الأسطر أيضاً، وهو ليس كذلك ( xargsيفصل افتراضياً على أسطر جديدة وفراغات داخل الأسطر، ويجب وضع السلاسل الفرعية التي تحتوي على فراغات بين علامتي اقتباس مفردة أو مزدوجة).
يتم توضيح مشكلة الفاصل هنا:
# أنشئ بعض الأهداف للتدرب عليها باللمس important_file touch 'not important_file' mkdir -p '12" records' ابحث عن . -الاسم ليس \* | tail -1 | xargs rm ابحث عن \! -name . -type d | tail -1 | xargs rmdir سيؤدي تشغيل الأمر أعلاه important_fileإلى إزالة الملف، لكنه لن يزيل الدليل المسمى 12" records، ولا الملف المسمى not important_file.
الحل الصحيح هو استخدام -print0الخيار الخاص بنظام GNU، ولكن tail(وغيره من الأدوات) لا يدعم السلاسل المنتهية بـ NUL:
# استخدم نفس أوامر التحضير المذكورة أعلاه : find . -name not \* -print0 | xargs -0 rm ابحث عن \! -name . -type d -print0 | xargs -0 rmdir عند استخدام هذا -print0الخيار، تُفصل الإدخالات بحرف فارغ بدلاً من نهاية السطر. وهذا يُعادل الأمر الأكثر تفصيلاً: أو بشكل أقصر، عن طريق التبديل إلى وضع الأسطر (غير POSIX) باستخدام خيار (الفاصل):find.-namenot\*|tr\\n\\0|xargs-0rmxargs-dfind.-namenot\*|xargs-d'\n'rm
لكن بشكل عام، يُفضل استخدام -0"with" ، لأن الأسطر الجديدة في أسماء الملفات لا تزال تمثل مشكلة.-print0
يُعدّ GNU parallelبديلاً xargsمصمماً ليحتوي على نفس الخيارات، ولكنه يعتمد على سطر الأوامر. لذا، باستخدام GNU Parallel بدلاً من ذلك، سيعمل ما سبق كما هو متوقع. [ 7 ]
بالنسبة لبيئات يونكس التي xargsلا تدعم -0الخيارين -d(مثل سولاريس، AIX)، ينص معيار POSIX على أنه يمكن ببساطة استخدام شرطة مائلة عكسية للهروب من كل حرف: . [ 8 ] بدلاً من ذلك، يمكن تجنب استخدام xargs تمامًا، إما باستخدام GNU parallel أو باستخدام وظائف .find.-namenot\*|sed's/\(.\)/\\\1/g'|xargsrm-exec ... +find
العمل على مجموعة فرعية من الحجج في كل مرة
قد يتعامل المستخدم مع أوامر لا تقبل سوى وسيط واحد أو وسيطين في كل مرة. على سبيل المثال، diffيعمل الأمر على ملفين في الوقت نفسه. يحدد -nالخيار xargsعدد الوسائط التي تُمرر إلى الأمر في كل مرة. سيتم استدعاء الأمر بشكل متكرر حتى استنفاد جميع المدخلات. لاحظ أنه في الاستدعاء الأخير، قد يحصل المستخدم على عدد أقل من الوسائط المطلوبة إذا كانت المدخلات غير كافية. استخدم xargsالخيار لتقسيم المدخلات إلى وسيطين في كل سطر.
$ صدى { 0..9 } | xargs -n 2 0 1 2 3 4 5 6 7 8 9إضافةً إلى إمكانية تشغيل الأمر بناءً على عدد محدد من الوسائط في كل مرة، يُمكن أيضًا استدعاء أمر لكل سطر من المدخلات باستخدام -L 1الخيار. يُمكن استخدام عدد غير محدود من الأسطر في كل مرة، ولكن سطرًا واحدًا هو الأكثر شيوعًا. إليك كيفية تنفيذ diffكل عملية git commit على العملية الأصلية. [ 9 ]
$ git log --format = "%H %P" | xargs -L 1 git diff مشكلة في الترميز
xargsلا تقتصر مشكلة استخدام البرنامج في وضعه الافتراضي على معالجة فواصل الوسائط xargs. فمعظم أدوات يونكس التي تُستخدم عادةً لمعالجة أسماء الملفات (مثل sed`/ aaa` basenameو` sort/bbb` وغيرها) هي أدوات لمعالجة النصوص. مع ذلك، فإن أسماء مسارات يونكس ليست نصوصًا بالمعنى الحرفي. لنأخذ مثالًا على اسم المسار `/aaa/bbb/ccc`. يمكن إنشاء المجلد `/aaa` والمجلد الفرعي `bbb` التابع له بواسطة مستخدمين مختلفين في بيئات مختلفة. هذا يعني أن هؤلاء المستخدمين قد يستخدمون إعدادات لغة مختلفة، وبالتالي قد لا يكون ترميز الأحرف لـ `aaa` و`bbb` متطابقًا بالضرورة. على سبيل المثال، قد يكون `aaa` بترميز UTF-8 و`bbb` بترميز Shift JIS. ونتيجةً لذلك، قد لا تتم معالجة اسم المسار المطلق في نظام يونكس بشكل صحيح كنص باستخدام ترميز حرف واحد. وقد تفشل الأدوات التي تعتمد على أن تكون مدخلاتها نصية في التعامل مع مثل هذه السلاسل النصية.
أحد الحلول البديلة لهذه المشكلة هو تشغيل هذه الأدوات في بيئة لغة C، والتي تعالج بايتات المدخلات كما هي. مع ذلك، سيؤدي هذا إلى تغيير سلوك الأدوات بطرق قد لا يتوقعها المستخدم (على سبيل المثال، قد لا تتحقق بعض توقعات المستخدم بشأن سلوك طي الأحرف).
مراجع
- ↑ "قائمة اختصارات يونكس: القائمة الكاملة" . www.roesler-ac.de . مؤرشف من الأصل بتاريخ 16 يوليو 2012. تم الاطلاع عليه بتاريخ 12 أبريل 2020 .
- ↑ "منافذ Win32 أصلية لبعض أدوات GNU" . unxutils.sourceforge.net . مؤرشف من الأصل بتاريخ 2006-02-09 . تم الاطلاع عليه بتاريخ 2025-08-11 .
- ↑ "أدوات معالجة النصوص لنظام ويندوز" . مؤرشف من الأصل بتاريخ 22-03-2022 . تم الاطلاع عليه بتاريخ 22-03-2022 .
- ↑ شركة IBM . "برمجة Qshell لنظام IBM System i الإصدار 7.2" (ملف PDF) . مؤرشف (PDF) من الأصل بتاريخ 18 سبتمبر 2020. تم الاطلاع عليه بتاريخ 5 سبتمبر 2020 .
- ↑ "الأسئلة الشائعة حول أدوات جنو الأساسية" . مؤرشف من الأصل بتاريخ 23 نوفمبر 2015. تم الاطلاع عليه بتاريخ 7 ديسمبر 2015 .
- ↑ "الحد الأقصى لطول الوسائط لعملية جديدة " . www.in-ulm.de
- ↑ الاختلافات بين xargs و GNU Parallel. مؤرشف بتاريخ 29 يوليو 2016 في Wayback Machine . GNU.org مؤرشف بتاريخ 22 فبراير 2011 في Wayback Machine . تم الاطلاع عليه في فبراير 2012.
- ↑ – مرجع الصدفة والأدوات المساعدة، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- ↑ كوزمين ستيجيريان. "أشياء ربما لم تكن تعرفها عن xargs" . مؤرشف من الأصل في 26 نوفمبر 2015. تم الاطلاع عليه في 7 ديسمبر 2015 .
روابط خارجية
- : إنشاء قوائم الوسائط واستدعاء الأدوات المساعدة – مرجع الصدفة والأدوات المساعدة، المواصفات الموحدة لنظام يونكس ، الإصدار 5 من مجموعة Open Group
صفحات الدليل
- – مرجع GNU Findutils
- : إنشاء قائمة (قوائم) الوسائط وتنفيذ الأداة المساعدة – دليل أوامر FreeBSD العامة
- : إنشاء قائمة (قوائم) الوسائط وتنفيذ الأداة المساعدة – دليل أوامر NetBSD العامة
- : إنشاء قائمة (قوائم) الوسائط وتنفيذ الأداة المساعدة – دليل أوامر OpenBSD العامة
- : إنشاء قوائم الوسائط واستدعاء الأداة المساعدة – دليل مرجعي لأوامر المستخدم في نظام التشغيل سولاريس 11.4
- أدوات معالجة النصوص في نظام يونكس
- أدوات يونكس SUS2008
- أوامر الخطة 9
- أوامر IBM i Qshell
