উত্তর:
এটি সিস্টেম এবং সংস্করণ, আর্গুমেন্টের সংখ্যা এবং আকার এবং পরিবেশের পরিবর্তনশীল নামের সংখ্যা এবং আকারের উপর নির্ভর করে।
Ixতিহ্যগতভাবে ইউনিক্সে, সীমাটি (হিসাবে রিপোর্ট করা হয়েছে getconf ARG_MAX
) কমবেশি আকারের কমবেশি ছিল:
'\0'
)'\0'
), একটি পরিবেশের স্ট্রিং যা কনভেনশন অনুসারে কিছু var=value
।মনে রাখা যে cp
আর্গুমেন্ট হিসাবে গণনা করা হয় (প্রথম যুক্তি)।
লিনাক্সে, এটি সংস্করণে নির্ভর করে। সেখানকার আচরণটি সম্প্রতি পরিবর্তিত হয়েছিল যেখানে এটি কোনও স্থির জায়গা নয়।
লিনাক্স ৩.১১-এ চেক করা getconf ARG_MAX
এখন স্ট্যাকের আকারের উপর নির্ধারিত সীমাটির এক চতুর্থাংশ বা 512kiB এর চেয়ে কম যদি 128kiB রিপোর্ট করে)।
( zsh
নীচের বাক্য গঠন):
$ limit stacksize
stacksize 8MB
$ getconf ARG_MAX
2097152
$ limit stacksize 4M
$ getconf ARG_MAX
1048576
এই সীমাটি আর্গুমেন্ট এবং পরিবেশের স্ট্রিং এবং কিছু ওভারহেডের সংমিশ্রণ আকারে (পৃষ্ঠা সীমানায় প্রান্তিককরণ বিবেচনার কারণে আমি সন্দেহ করি)। পয়েন্টার আকার বিবেচনা করা হয় না।
সীমাটি অনুসন্ধান করে, আমি পেয়েছি:
$ /bin/true {1..164686}
$ /bin/true {1..164687}
zsh: argument list too long: /bin/true
$ x= /bin/true {1..164686}
$ x=1 /bin/true {1..164686}
zsh: argument list too long: /bin/true
সেক্ষেত্রে ব্রেক করার আগে সর্বাধিক সংখ্যার আকার:
$ (env _=/bin/true x=;print -l /bin/true {1..164686}) | wc -c
1044462
এখন, এর অর্থ এই নয় যে আপনি 1 মিলিয়ন খালি যুক্তি পাস করতে পারবেন। একটি 64 বিট সিস্টেমে, 1 মিলিয়ন খালি যুক্তিগুলি 8MB এর পয়েন্টার তালিকা তৈরি করে, যা আমার স্ট্যাক আকার 4MiB এর ওপরে হবে।
$ IFS=:; /bin/true ${=${(l.1000000..:.)${:-}}}
zsh: killed /bin/true ${=${(l.1000000..:.)${:-}}}
(আপনি লক্ষ্য করেছেন এটি কোনও E2BIG ত্রুটি নয় I'm আমি নিশ্চিত নই যে প্রক্রিয়াটি কোন পর্যায়ে সেখানে মারা যায় যদিও এটি execve
সিস্টেম কলের বা তার পরে থাকলে)।
এছাড়াও লক্ষ করুন (এখনও লিনাক্স 3.11 এ) একটি একক যুক্তি বা পরিবেশের স্ট্রিংয়ের সর্বাধিক আকার 128kiB, স্ট্যাকের আকার নির্বিশেষে।
$ /bin/true ${(l.131071..a.)${:-}} # 131072 OK
$ /bin/true ${(l.131072..a.)${:-}} # 131073 not
zsh: argument list too long: /bin/true
$ /bin/true ${(l.131071..a.)${:-}} ${(l.131071..a.)${:-}} # 2x 131072 OK
164686
নম্বর নিয়ে এসেছেন ? অর্থাৎ আপনি কীভাবে গণনা করলেন যে ক্রমটি 2097152
ARG_MAX আকারের অধীনে থাকবে?
এটি ARG_MAX এর মানের উপর নির্ভর করবে যা সিস্টেমের মধ্যে পরিবর্তন করতে পারে। আপনার সিস্টেমে রান করার মান জানতে (উদাহরণ হিসাবে আমার উপর ফলাফলটি দেখানো):
$ getconf ARG_MAX
2097152
এটির সাথে cp
বা আপনার শেলের কোনও সম্পর্ক নেই , এটি কার্নেলের দ্বারা আরোপিত একটি সীমা, exec()
তাদের আর্গুমেন্ট দীর্ঘ না হলে এটি ( ) আদেশগুলি কার্যকর করবে না ARG_MAX
। সুতরাং, আপনি যে আর্গুমেন্ট তালিকার দৈর্ঘ্য দিয়েছেন তা cp
যদি ARG_MAX এর চেয়ে বেশি হয় তবে cp
কমান্ডটি মোটেও চলবে না।
আপনার মূল প্রশ্নের উত্তর দেওয়ার জন্য, cp
কোনও ফাইল প্রক্রিয়া করবে না কারণ এটি এত যুক্তি দিয়ে কখনই কার্যকর করা হবে না। আমার আরও উল্লেখ করা উচিত যে এটি আর্গুমেন্টের সংখ্যার উপর নির্ভর করে না তবে তাদের দৈর্ঘ্যের উপর নির্ভর করে। খুব কম তবে খুব দীর্ঘ ফাইলের নাম নিয়ে আপনার একই ধারণা থাকতে পারে।
এই ত্রুটিগুলি সম্পর্কে জানার উপায়টি হ'ল আপনার কমান্ডটি একটি লুপে চালানো:
for file in /src/*; do cp "$file" /dst/; done
C
এআরজি_এমএক্স এবং সত্যই দীর্ঘ ফাইলের নামগুলির সাথে সমস্যা থাকতে পারে?
IFS="\n" for file in /src/*; do mv "$file" /dst/; done
বাrsync -a /src/ /dst/
।