বাশ লুপ - আমি যখন কমান্ডের ভিতরে কন্ট্রোল-সি টিপব তখন লুপটি কীভাবে থামানো যায়?


35

আমি কয়েকটি ডিরেক্টরি আরম্ভ করছি। আমার একটি বাশ টার্মিনাল খোলা আছে এবং এরকম কিছু কার্যকর করা হচ্ছে:

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done

তবে আমি যদি পুরো জিনিসটি থামাতে চাই তবে আমি কন্ট্রোল-সি টিপুন। এটি আরএসআইএনসি বন্ধ করে দেয় তবে তারপরে এটি পরবর্তীটিতে চলে যায়। এই ক্ষেত্রে আমি বুঝতে পেরেছি কি হয়েছে এবং তারপরে পাগলের মতো কন্ট্রোল-সি টিপুন যতক্ষণ না জিনিসগুলি আবার কাজ করে।

এই সমাধানের জন্য কিছু উপায় আছে কি. আমি এটি চাই তাই যদি আমার মতো লুপ থাকে এবং কন্ট্রোল-সি টিপুন, এটি আমার বাশ শেলের কাছে ফিরে আসবে।


6
ডেনিসের উত্তরটি সঠিক, তবে আপনি যদি তা না করেন তবে আপনাকে 'পাগলের মতো চাপতে হবে' না, কেবল এটি ধরে রাখুন এবং কীবোর্ডটি পুনরায় হ্যান্ডেল করতে দিন :-)
কাইল ব্র্যান্ড

আমি সবসময় কেবল Cntl-C চেপে রাখি, সাধারণত ভাল কাজ করে।
স্কট অ্যালান মিলার

উত্তর:


33
for DIR in * ; do rsync -a $DIR example.com:somewhere/ || break; done

যদি কোনও কারণে কোনও পৃথক আরএসসিএন রান ব্যর্থ হয় তবে এটি লুপ থেকে প্রস্থান করবে।


4
অতিরিক্ত টিপ: আপনি যদি নেস্টেড লুপে থাকেন এবং সম্পূর্ণরূপে সমাপ্ত করতে চান তবে break 2("2" বাছাই করতে চান এমন নেস্টেড লুপগুলির সংখ্যার সাথে প্রতিস্থাপন করুন)।
দোলান অ্যান্টুচি

26

ডেনিসের উত্তরে প্রসারিত করতে, আপনার কোডটি দেখতে এমন হতে পারে:

trap "echo Exited!; exit;" SIGINT SIGTERM

একটি কাজের উদাহরণের জন্য (এতে rsync জড়িত রয়েছে), http://gist.github.com/279849 দেখুন


ধন্যবাদ, এটি একটি জেনেরিক সমাধান যা আমার পক্ষে কাজ করেছে
wi1

25

আপনি কন্ট্রোল-সি এর জন্য একটি ফাঁদ সেট করতে পারেন।

trap <command> SIGINT

commandকন্ট্রোল-সি চাপলে কার্যকর করা হবে । শুধু করা trapএকটি বিন্দু যেখানে আপনি এটি কার্যকর হতে চান আপনার স্ক্রিপ্টের মধ্যে বিবৃতি কোথাও।


6

যখন আপনি বন্ধনীগুলির মধ্যে কমান্ডের একটি স্ট্রিং রাখবেন, তখন স্ট্রিংটি একটি একক প্রক্রিয়া হিসাবে কাজ করবে, এবং আপনি যখন আঘাত করবেন তখন সাইন ইন করবে এবং সমাপ্ত হবে Ctrl- C:

(for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done)

কিন্ত! rsyncকমান্ডের ক্ষেত্রে এটি একাধিক উত্সের অনুমতি দেয়, সুতরাং আপনার লেখা কোডটি আরও ভালভাবে লিখিত হবে:

rsync -a * example.com:somewhere/

6
  1. Ctrl-Zস্ক্রিপ্ট স্থগিত করতে টিপুন ;
  2. kill %%

এই উত্তরে ক্রেডিট, ব্যাখ্যা এবং আরও বিশদ ।


এটি দুর্দান্ত কারণ এটি যখন আপনি ইতিমধ্যে শুরু করেছেন দীর্ঘ-চলমান লুপটিতে বাধা দিতে চান তখন এটি "পোস্ট ফ্যাক্টো" কাজ করে।
নিক মাত্তিও

0

আমি আমার লুপে আরেকটি কমান্ড রাখি যা সহজেই বাধা হয়ে যায়। এটি টিপতে দুটি সিটিআরএল-সি প্রয়োজন।

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; sleep 1 ; done

এটি এই আরএসসিএনসিটির পক্ষে এত বড় সমাধান নয়, যা আপনি সম্ভবত দ্রুত চালাতে চান। তবে এটি অন্যান্য লুপগুলির জন্য ভাল কাজ করে:

while true ; do ping -c 10 example.com ; sleep 1 ; done

এই লুপটি প্রতিবার লুপের মাধ্যমে উদাহরণ ডট কমের ঠিকানাটি পুনরায় সন্ধান করবে, আপনি যদি ডিএনএস পরিবর্তনের জন্য সন্ধান করছেন তবে তা কার্যকর।

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