বাশ ফাংশনে কীভাবে সেটআপ ট্র্যাপ করবেন?


13

আমি trapব্যাশ স্ক্রিপ্টগুলিতে সেটআপ করতে পারি তবে ব্যাশ ফাংশনগুলি না।

উদাহরণস্বরূপ, sourceনীচের কোডটি এবং চালান f, এখন Ctrl+ চেষ্টা করুন C, এটি আটকা হয়নি!

trapবাশ ফাংশনে কীভাবে সেটআপ করবেন ?

  4 trap ctrl_c INT
  5 
  6 ctrl_c () {
  7  echo "** Trapped CTRL-C"
  8 }
  9 
 10 
 11 f () {
 12   for i in `seq 1 100`; do
 13     sleep 1
 14     echo -n "."
 15   done
 16 } 

2
আপনি fআপনার কোড শেষে এবং একটি থেকে স্থান সরাতে পারেন f ()
GWF

উত্তর:


7

কারণ এটি অগ্রভাগে প্রিন্টের পরিবর্তে bash(যা স্ক্রিপ্টটি চালাচ্ছে) প্রেরণে SIGINT প্রেরণ করে । আপনি যদি এটি করতে চান তবে ফাংশনটিকে অবিচ্ছিন্ন করুন এবং তারপরে ব্যবহার করুন wait(যা প্রত্যাশা অনুযায়ী কাজ করবে এবং ফাঁদটি ব্যবহার করবে) use


এটা একধরণের কাজ। তবে আমি দেখতে পেলাম যে যদি fপাইপে থাকে echo 123 | fতবে তা আটকা পড়ে না?
চেং

@ চেং একটি সাব-শেল ব্যবহার করুন (এবং এই ক্ষেত্রে একটি পাইপ অপ্রয়োজনীয়, কেবল একটি হেরডোক / এইহেন স্ট্রিং ব্যবহার করুন)। (command | command) &
ক্রিস ডাউন

1

প্রতিলিপি: অগ্রভাগের প্রক্রিয়াটি Ctrl- \কখন Ctrl- C, - Z, - Dকাজ করছে না তার সাথে একটি ক্যুইট প্রেরণ করুন ।

এর সাথে মৃত্যুদন্ডের শেষে ফাঁদগুলি সাফ করুন trap - list of signals here

একটি অ-উত্পাদন সিস্টেমের মধ্যে মজা: সমস্ত বুদ্ধিমান সংকেতগুলির জন্য একটি ফাঁদ সেট করার চেষ্টা করুন (যেমন, খুন নয়)। kill -l(এটি লোয়ার-কেস এল নয় এটি 1 নম্বর বা পাইপ নয়))


0

আমি মনে করি আপনার এই ফাংশনটি বিশ্বব্যাপী করা উচিত

#!/bin/bash
trap ctrl_c INT
ctrl_c () {
  echo "** Trapped CTRL-C"
} 
for i in `seq 1 100`; do
  sleep 1
  echo -n "."
done

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