bash - ويندوز - نظام تشغيل يعتمد على سطر الأوامر command line interface
باش سطر الأوامر والحد من المدخلات (2)
حسنا ، دينيزنز. لذلك فقد قبلت حدود طول سطر الأوامر مثل الإنجيل لبعض الوقت. إذن ، ماذا أفعل بافتراضات المرء؟ بطبيعة الحال - التحقق منها.
لدي جهاز 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
حرف في قائمة الوسيطة - بما في ذلك ، يجب ملاحظة بيانات البيئة.
هل هناك نوع محدد من الأحرف المسموح به في باش (أو أصداف أخرى) كم من الوقت يمكن أن يكون الإدخال؟ إذا كان الأمر كذلك ، فما هو الحد المسموح به؟
أي هل من الممكن كتابة أمر في bash أطول من اللازم لتنفيذ سطر الأوامر؟ إذا لم يكن هناك حد مطلوب ، فهل هناك حد مقترح؟
هناك حد المخزن المؤقت لشيء من هذا القبيل 1024. والقراءة ببساطة تعليق معجون منتصف أو المدخلات. لحل هذه المشكلة ، استخدم الخيار -e.
http://linuxcommand.org/lc3_man_pages/readh.html
-e استخدام Readline للحصول على الخط في shell التفاعلية
تغيير قراءة لقراءة -e ومعلقة خط معلقة مزعج تختفي.