bash - ويندوز - نظام تشغيل يعتمد على سطر الأوامر command line interface




باش سطر الأوامر والحد من المدخلات (2)

هل هناك نوع محدد من الأحرف المسموح به في باش (أو أصداف أخرى) كم من الوقت يمكن أن يكون الإدخال؟ إذا كان الأمر كذلك ، فما هو الحد المسموح به؟

أي هل من الممكن كتابة أمر في bash أطول من اللازم لتنفيذ سطر الأوامر؟ إذا لم يكن هناك حد مطلوب ، فهل هناك حد مقترح؟


حسنا ، دينيزنز. لذلك فقد قبلت حدود طول سطر الأوامر مثل الإنجيل لبعض الوقت. إذن ، ماذا أفعل بافتراضات المرء؟ بطبيعة الحال - التحقق منها.

لدي جهاز Fedora 22 في تصرفي (يعني: Linux with bash4). لقد قمت بإنشاء دليل يحتوي على 500000 رمز inodes (ملفات) يحتوي كل منها على 18 حرفًا. طول سطر الأوامر هو 9،500،000 حرف. تم إنشاؤه بالتالي:

seq 1 500000 | while read digit; do
    touch $(printf "abigfilename%06d\n" $digit);
done

ونلاحظ:

$ getconf ARG_MAX
2097152

لاحظ مع ذلك أنه يمكنني القيام بذلك:

$ echo * > /dev/null

لكن هذا يفشل:

$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long

يمكنني تشغيل حلقة for:

$ for f in *; do :; done

وهو قذيفة أخرى بنيت.

قراءة دقيقة للوثائق لحالات ARG_MAX ، الحد الأقصى لطول الوسيطة لوظائف exec . هذا يعني: بدون استدعاء exec ، لا يوجد أي قيود ARG_MAX . لذلك سوف يشرح لماذا لا تقتصر ARG_MAX .

وبالفعل ، يمكنني أن أحصل على دليلي إذا كانت قائمة الوسائط الخاصة بي هي 109948 ملفًا ، أو حوالي 2089000 حرف (أعطي أو أخذ). بمجرد إضافة ملف filename أكثر من 18 حرفًا ، على الرغم من ذلك ، فأنا أحصل على قائمة وسيطة طويلة جدًا . لذلك يعمل ARG_MAX كما هو معلن: exec يفشل مع أكثر من ARG_MAX حرف في قائمة الوسيطة - بما في ذلك ، يجب ملاحظة بيانات البيئة.


هناك حد المخزن المؤقت لشيء من هذا القبيل 1024. والقراءة ببساطة تعليق معجون منتصف أو المدخلات. لحل هذه المشكلة ، استخدم الخيار -e.

http://linuxcommand.org/lc3_man_pages/readh.html

-e استخدام Readline للحصول على الخط في shell التفاعلية

تغيير قراءة لقراءة -e ومعلقة خط معلقة مزعج تختفي.





command-line-arguments