বাশ: প্রতিধ্বনি: লেখার ত্রুটি: সিস্টেম কল


9

আমি ৮-সংখ্যার নম্বর সহ একটি সাজানো তালিকা তৈরি করতে চাই - 00000000 থেকে 99999999 পর্যন্ত shell আমি শেলটি টাইপ করেছি:

f() {
 while IFS="" read -r line; do
   for i in {0..9}; do 
       echo "$line$i";
   done;
 done
}

echo | f | f | f | f | f | f | f | f | tee result.txt | wc -l

প্রতিক্রিয়া হয়

bash: echo: write error: Interrupted system call
bash: echo: write error: Interrupted system call
bash: echo: write error: Interrupted system call
99998890

আমি কেন এই তিনটি ত্রুটি এবং ত্রুটিযুক্ত ফলাফল পেয়েছি? টেক্সট?

আমি ব্যবহার করি

জিএনইউ বাশ, সংস্করণ ৪.৪.১২ (১) -আর দয়া করে (x86_64-pc-linux-gnu)

ডেবিয়ান জিএনইউ / লিনাক্স 9.6 (প্রসারিত)

লিনাক্স কার্নেল: 4.19.0 # 2 এসএমপি থু নভেম্বর 1 15:31:34 ইইটি 2018 x86_64 জিএনইউ / লিনাক্স


2
আমি সাহায্য করতে পারি না তবে এটি করার এই পদ্ধতিটি অনুভব করা তার চেয়ে বেশি দক্ষ হবে না seq -w 0 99999999
কুসালানন্দ

1
তাহলে প্রশ্নটি অসম্পূর্ণ / ভুল / খারাপভাবে লিখিত বা অন্য কিছু something কারণ স্ক্রিপ্টটি (যখন সমাপ্ত হলে }) সঠিকভাবে কাজ করে। @ জিএডি 3 আর
আইজাক

1
দ্রষ্টব্য: আমি প্রায় চাহিদা অনুযায়ী এই ত্রুটিগুলি ট্রিগার করতে পারি। যখন আমি আমার konsoleউইন্ডোটির আকার পরিবর্তন করি তখন তারা প্রায়শই উপস্থিত হয় । এই ধরনের আকার পরিবর্তন আমার ক্ষেত্রে প্রায় যথেষ্ট, তবুও প্রয়োজনীয় নয়।
কামিল ম্যাকিয়েরোভস্কি

আমি এটি মুছে ফেলতে পারি | tee result.txtএবং তবুও ত্রুটি পেতে পারি।
ctrl-alt-delor

আরেকটি নোট: বাহ্যিক এক্সিকিউটেবল ( /bin/echoআমার ক্ষেত্রে) echoবিল্টিনের পরিবর্তে ফাংশনটিকে এই ইস্যুটির প্রতিরোধ ক্ষমতা (বা কমপক্ষে কম প্রবণ) করে তোলে।
কামিল ম্যাকিয়েরোভস্কি

উত্তর:


6

write error: Interrupted system callস্ক্রিপ্টটি কার্যকর করা অবস্থায় কনসোল উইন্ডোর আকার পরিবর্তন করা হলে নির্দিষ্ট ত্রুটি তৈরি করা হয়।

একটি করছেন:

 trap '' SIGWINCH

এটি এড়াতে হবে।

দ্রষ্টব্য যে ক

 seq 99999999 >result.txt; wc -l <result.txt

উভয় দ্রুত হবে এবং SIGWINCHসমস্যা এড়াতে হবে ।


5
সুতরাং কি হচ্ছে ?, আমি কেন আগে এটি দেখিনি ?, কেন একটি লেখার ত্রুটি, সঠিক জিনিস?
ctrl-alt-delor

4

এটি আসলে একটি বাগ [1] ইন bashএবং এটি কেবলমাত্র ঘটে না SIGWINCH, তবে এমন কোনও সংকেতেও আসে যার জন্য একটি ফাঁদ সেট করা হয়েছিল:

{ pid=$BASHPID; trap : USR1; (sleep 1; kill -USR1 $pid) &
         printf %0100000d 1; } | sleep 3600
bash: printf: write error: Interrupted system call

ঘটনাচক্রে কারণ bash) হয় একটি ব্যর্থ হয় তার সংকেত হ্যান্ডলার সেট SA_RESTARTছাড়া ( SIGCHLDহ্যান্ডলার), অথবা খ) হ্যান্ডেল EINTRযখন কলিং write()মধ্যে printfএবং echobuiltins।

EINTR("বিঘ্নিত সিস্টেম কল") কোনও ত্রুটির শর্তটি নির্দেশ করার উপায় নয়, তবে একটি হ্যাক যা প্রোগ্রামারকে প্রধান লুপের সিগন্যালগুলি পরিচালনা করার সাথে সাথে ব্লকিং রিড / রাইটিং / ইত্যাদি একত্রিত করতে দেয়। এটি কখনও ব্যবহারকারীর কাছে ফাঁস করা উচিত নয়।

এই বাগটি খুব বেশি ঘন ঘন দেখা যায় না কারণ এটি সঠিক অবস্থানে থাকার জন্য এটি বেশ কীর্তি: write()একটি বিল্টিন দ্বারা করা উচিত (বাহ্যিক আদেশ দ্বারা নয়), এটি পাইপ বাফারটি পূরণ করতে হবে (অন্য পাঠককে পাঠক) শেষটি খুব ধীর হওয়া উচিত বা পাইপ থেকে পড়া এখনও মোটেও জীবিত নয় ) এবং স্ক্রিপ্টটির ফাঁদ ব্যবহার করা উচিত বা টার্মিনাল উইন্ডোটি পুনরায় আকার দেওয়া উচিত।

যেহেতু বিভিন্ন বাস্তবায়ন নিদর্শন, এই শুধুমাত্র বিঘ্নিত প্রভাবিত write()গুলি না read()s অথবা open()(যেমন হিসাবে। ব্লক গুলি open()একটি নামাঙ্কিত পাইপের / FIFO)।

[1] এর একটি ফর্ম ইতিমধ্যে কিছু সময় আগে প্রতিবেদন করা হয়েছিল ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.