خطای Argument list too long یکی از خطاهای رایج در محیط لینوکس می باشد که معمولا در زمان کار با تعداد زیادی از فایل در یک دایرکتوری رخ می دهد:
[root@LinuxHost mydir]# rm –rf *.html
-bash: /bin/rm: Argument list too long
[root@LinuxHost mydir]# cp * /dir1
-bash: /usr/bin/cp: Argument list too long
[root@LinuxHost mydir]# ls -l *
-bash: /usr/bin/ls: Argument list too long
همانطور که از متن خطا مشخص است، تعداد آرگومانهای دستور(که به جای علامت ستاره قرار می گیرند)، از حد مشخصی بیشتر است.
ls -l file1 file2 file3 … fileN
توضیح آنکه، به صورت پیش فرض، حداکثر طول آرگومانهای یک دستور در محیط لینوکس، برابر با مقدار ARG_MAX می باشد:
[root@LinuxHost ~]# getconf ARG_MAX
2097152
رخ دادن خطای Argument list too long، به نشانه تجاوز تعداد آرگومانها از عدد تعیین شده برای ARG_MAX خواهد بود و برای جلوگیری از رخ دادن این خطا می توان ARG_MAX را به عدد بالاتری تنظیم کرد.
البته امکان تنظیم مستقیم ARG_MAX وجود ندارد و با توجه به آنکه مقدار ARG_MAX به سایز stack بستگی دارد، برای افزایش مقدار آن باید اندازه stack را افزایش داد.
توجه: ARG_MAX نسبت ¼ با اندازه stack دارد.
در ادامه خطای Argument list too long را با افزایش مقدار stack و متعاقب آن افزایش مقدار ARG_MAX برطرف می کنیم.
مقدار جاری stack بر اساس کیلوبایت:
[root@LinuxHost ~]# ulimit -s
8192
تغییر مقدار stack در سطح session:
[root@LinuxHost ~]# ulimit -s 55555555
با تغییر مقدار stack به عددی بالاتر(به صورت random)، خواهیم دید که حذف محتویات دایرکتوری mydir (که در ابتدای متن با خطا متوقف شد)، بدون خطا قابل انجام خواهد بود:
[root@LinuxHost mydir]# rm -rf *
[root@LinuxHost mydir]# ls -l
total 0
برای تنظیم مقدار stack به حداکثر مقدار ممکن آن، می توان از دستور زیر استفاده کرد:
[root@LinuxHost mydir]# ulimit -s unlimited
[root@LinuxHost mydir]# getconf ARG_MAX
4611686018427387903
البته تغییر مقدار stack برای رفع خطای Argument list too long، تنها راه چاره نیست و حتی توصیه هم نمی شود. راهکارهای دیگری برای حل این مسئله وجود دارند که در ادامه سه مورد از آنها را مشاهده می کنید:
راهکار اول:
[root@LinuxHost mydir]# find . –name ‘*.html’ | xargs rm –f
[root@LinuxHost mydir]# ls –l
total 0
راهکار دوم:
[root@LinuxHost mydir]# for i in `ls`; do rm -f $i; done
راهکار سوم:
[root@LinuxHost ~]# mv /root/jasper/mydir /root/mydir-old
[root@LinuxHost ~]# mkdir -p /root/jasper/mydir
[root@LinuxHost ~]# rm -rf /root/mydir-old