বাশ-এ শেষ হয়ে গেলে একটি আদেশ ক্রমাগত পুনরায় সম্পাদন করুন exec


62

আমি কোনও কারণেই (ত্রুটি বা অন্যথায়) যখনই কোনও কমান্ড শেষ করে পুনরায় সম্পাদন করার সহজ উপায়টি বের করার চেষ্টা করছি।

এটির কাছে যাওয়ার সর্বোত্তম উপায় কী হবে?

সম্পাদনা: আমি আগে যথেষ্ট পরিষ্কার ছিল না। পূর্ববর্তীটি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে আমার পরবর্তী মৃত্যুদণ্ডের প্রয়োজন need

সম্পাদনা 2: প্রায় সমস্ত উত্তর দুর্দান্ত কাজ করে। আমি ভুল করে ভেবেছিলাম বেশিরভাগ উত্তর হয় প্রক্রিয়াটি কাঁটাচামচ করে দেবে বা কেবল একবার এটি পুনরায় কার্যকর করবে, যার কোনটিই চাইনি।

linux  bash 

1
আপনি এখনও পরিষ্কার নয়। আপনি কোন প্রোগ্রামটি চালাচ্ছেন তা উল্লেখ করলে এটি সহায়তা করবে।
ড্যানিয়েল অঙ্গুলিনির্দেশ

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

উত্তর:


39

এটি commandবারবার চালিত করে একটি অসীম লুপ তৈরি করে ।

while :
    do
        command
done

মূল প্রশ্নে সম্পাদনা দেখুন। আমার একবারে নয়, বার বার এটি চালিয়ে যাওয়া দরকার।

8
@ ক্যালসিফার এই উত্তরটি বেশ ভালভাবে কাজ করে। আপনার প্রোগ্রামটি সম্পর্কে অস্বাভাবিক কিছু আছে যা এখনও পর্যন্ত প্রত্যাশিত উত্তর দেওয়া চারজন ব্যবহারকারীর মধ্যে নেই এবং আপনি এটি উল্লেখ করতে ব্যর্থ হন।
ড্যানিয়েল অঙ্গুলিনির্দেশ

@ ক্যালসিফার এটি একটি অসীম লুপ। এটি সময় শেষ না হওয়া পর্যন্ত পুনরাবৃত্তি করে চলেছে (ভাল, স্ক্রিপ্টটি যেভাবেই শেষ না হওয়া পর্যন্ত)
নট কোপ্পেনহেভার

1
আমার খারাপ, আমি ভেবেছিলাম এটি (এবং অন্যান্য সমস্ত উত্তর) হয় প্রক্রিয়াটি কাঁটাচামচ করবে বা কেবল একবার এটি পুনরায় কার্যকর করবে, যার কোনটিই চায়নি। হ্যাঁ, এই উত্তরটি কাজ করে। ধন্যবাদ।

1
এক লাইন সংস্করণ: while true; do echo 'Hit CTRL+C'; sleep 1; done, ধন্যবাদ cyberciti.biz/faq/bash-infinite-loop
jk2K

107

watchকমান্ড একটি বিরতি নিদিষ্ট সাথে সব সময় প্রবেশ কমান্ড পুনরাবৃত্তি হবে:

watch -n0 <command>

-nকার্যকরভাবে শূন্যে সেট করা ব্যবধানটি কিছুতেই রাখে না (আমি মনে করি এটি সত্যই .1 সেকেন্ড)।

watch আউটপুট প্রান্তিককরণের অতিরিক্ত সুবিধাও রয়েছে যাতে ভিজ্যুয়াল পরিবর্তনগুলি সহজেই দেখা যায় এবং শেষ রান থেকে পরিবর্তনগুলি হাইলাইট করার জন্য একটি সুইচ রয়েছে।

তথ্যসূত্র: ওয়াচ ম্যান পৃষ্ঠা :

ঘড়িটি বার বার সঞ্চালন করে, এর আউটপুট প্রদর্শন করে (প্রথম স্ক্রিনফুল)। এটি আপনাকে সময়ের সাথে সাথে প্রোগ্রামের আউটপুট পরিবর্তন দেখতে দেয়। ডিফল্টরূপে, প্রোগ্রামটি প্রতি 2 সেকেন্ডে চালিত হয়; ভিন্ন ব্যবধান নির্দিষ্ট করতে -n বা --interval ব্যবহার করুন।

বাধা না হওয়া পর্যন্ত ঘড়িটি চলবে।


মূল প্রশ্নে সম্পাদনা দেখুন।

6
এখন পর্যন্ত সমস্ত উত্তর এটি সহ, এটি করে। আপনি বিশেষভাবে এটি না জিজ্ঞাসা না করে লিনাক্স কাঁটাচামচ করবে না।
পল

আমি কাঁটাচামচ সম্পর্কে জানি না, ধন্যবাদ।

আমি এই পদ্ধতিটি ব্যবহার করে কোনও আউটপুট দেখতে পাচ্ছি না।
রাফি খ্যাচাডৌরিয়ান

@ রাফিখাটচাডুরিয়ান আপনি কি বলছেন যে আপনি watch lsযদি কোনও ডিরেক্টরিতে ফাইল যুক্ত করেন তবে কিছুই পান না?
পল

17

একটি সহজ সমাধান হবে:

yourcommand; !#

;এক লাইনে একাধিক কমান্ডের জন্য কমান্ডগুলি পৃথক করে ( বাশ: তালিকা )

!#বাশকে "এই লাইনে আমি এখন পর্যন্ত যা কিছু লিখেছি সবগুলি পুনর্বার করতে" বলি ( বাশ: ইভেন্ট-ডিজাইনার )


1
দুঃখিত, আমি যথেষ্ট পরিষ্কার ছিল না। আমার একবারে নয়, বার বার এটি চালিয়ে যাওয়া দরকার।

এর জন্য ধন্যবাদ, আমি এটি সন্ধান করছিলাম, বিশেষত যেহেতু yourcommand; !!একই লাইনে কমান্ডগুলি সহ আসলে কাজ করে না তবে !#মনে হয়। চিয়ার্স!
sdaau

; !#জেডএসএইচে কাজ করেনি, এটি কেবল বিবৃতিটিকে মূলত ক্লোনিং করে প্রসারিত করে, এটি ট্রিগার করে না
পুনর্বিবেচনা করুন

7

আপনি কমান্ড কার্যকর করার সময় পরিকল্পনা করতে পারেন (প্রদত্ত এটি ইন্টারেক্টিভ নয়) এবং প্রবেশ করান !!যা পূর্ববর্তী আদেশটি আবার কার্যকর করবে ute এটি যেমন উদাহরণস্বরূপ কাজ করে ping -c 5


আপনি এখানে কোনও ফাংশন সংজ্ঞায়িত করতে পারেন bash:

function repeat { "$@"; "$@"; }

এটি অবিরত রাখতে, এটি সঞ্চয় করুন ~/.bashrc

তারপরে, আপনি আপনার আদেশটি এভাবে চালাতে পারেন:

repeat ping -c5 heise.de

যদি এটি একটি নির্দিষ্ট কমান্ড আপনি বারবার কার্যকর করতে চান (এবং কোনও কমান্ড নয়), আপনি "$@"সেই স্নিপেটে আপনার প্রকৃত কমান্ড দিয়ে প্রতিস্থাপন করতে পারেন এবং এর repeat_pingপরিবর্তে ফাংশনটির নাম রাখতে পারেন ।


এটিকে একটি অসীম লুপ তৈরি করতে আপনি @ ডেনিসের পরামর্শ অনুসারে যা করতে পারেন। যদি আপনি এটির মত ইন্টারেক্টিভ শেলটিতে ব্যবহার করতে চান তবে আপনাকে অপেক্ষা করার সময়সীমা যুক্ত করার পরামর্শ দিচ্ছি:

function repeat { while 1 ; do "$@" ; sleep 1 ; done; }

অন্যথায় এটি অসীম লুপটি ব্যবহার করে বাতিল করা বরং অসুবিধাজনক Ctrl-Z


মূল প্রশ্নে সম্পাদনা দেখুন।

6
@ ক্যালসিফার এই ফাঁসিগুলি প্রোগ্রাম কলটি না আসা পর্যন্ত অপেক্ষা করে। আপনার প্রোগ্রামটি শেল থেকে আলাদা হয়ে যায় এবং এটি প্রস্থান করার আগেই ফিরে আসে?
ড্যানিয়েল অঙ্গুলিনির্দেশ

আমার খারাপ, আমি ভেবেছিলাম এটি (এবং অন্যান্য সমস্ত উত্তর) হয় প্রক্রিয়াটি কাঁটাচামচ করবে বা কেবল একবার এটি পুনরায় কার্যকর করবে, যার কোনটিই চায়নি। হ্যাঁ, এই উত্তরটি কাজ করে। ধন্যবাদ।

4

নীচের whileমতো একটি লুপটি বুলিয়ান শর্ত দিন :

#!/bin/bash

while true; do

    do_something && wait

done

প্রক্রিয়াটি শেষ করার জন্য ব্যাশ সংকেত না পাওয়া পর্যন্ত এটি কার্যকর হবে। সাধারণত আকারে ctrl+c

আপনি watchবারবার পাশাপাশি স্ক্রিপ্ট চালানোর জন্য কমান্ডটি ব্যবহার করতে পারেন । উদাহরণস্বরূপ আপনার ব্যাশ টার্মিনালে একটি সাধারণ ঘড়ি ব্যবহার করে watchদেখতে পেল :

$ watch -t -n1 date +%T

-tবিকল্প বলে watchপ্রক্রিয়া এটা চলমান একটি শিরোনাম প্রদর্শন করবে না। এটি আপনাকে পুনরাবৃত্তি হওয়া কেবলমাত্র আদেশের একটি পরিষ্কার আউটপুট দেয়। -n1বিকল্প যে পুনরাবৃত্তি ঘড়ি বলে nসেকেন্ড। এই ক্ষেত্রে, দ্বিতীয় -n1অন্তর হতে হবে 1। তারপরে date +%Tকমান্ড সমাপ্তির সময়টি প্রদর্শন করে shows এই কমান্ডটি করা আপনার টার্মিনালে আপনাকে একটি সক্রিয় ঘড়ি দেবে।

এবং তারপরে আর একটি উত্তর যা অন্য উত্তরগুলির মধ্যে নেই সেগুলি হ'ল অসীম ফাংশন কল।

do_something() { do_something }; do_something && wait

এটি মূলত whileকেবল পুনরাবৃত্তির ফাংশন কল ব্যবহার করে বুলিয়ান লুপের সমান ।

(সম্পাদনা) আপনার মেশিনের সংস্থানগুলি মাথায় রাখার জন্য, আমি এটি যুক্ত করেছি && waitযাতে প্রতিবার কোনও প্রক্রিয়া চালিত হয়, পরবর্তী পুনরাবৃত্তির আগে প্রসেস স্ট্যাটাস 0 দিয়ে প্রক্রিয়াটি শেষ না হওয়া অবধি লুপগুলি "অপেক্ষা" করবে। এটি একটি ইন্টারেক্টিভ শেল স্ক্রিপ্টে দরকারী।


1
একটি whileলুপের উদাহরণ রয়েছে তবে এটি বুলিয়ান trueসিনট্যাক্স ব্যবহার করছে না । একটি watchউদাহরণ আছে তবে এটি অনেক দরকারী সিনট্যাক্স দেয় না। যার জন্য এটি সহায়তা করতে পারে তার জন্য আমি এগুলি ব্যাখ্যা করছি। আমি এগুলিকে কিছু ব্যবহারিক উপযোগিতা দিতে চাই। whileলুপ বুলিয়ান এও হতে পারে falseএবং চালানো না যতক্ষণ না একটি অসত্য শর্ত পূরণ করা হয়। এটি বেশ সহজ।

1
@ স্পিট্টিন'আইটি এমন একটি পদ্ধতি যুক্ত করেছেন যা আপনার সুবিধার জন্য অন্যান্য উত্তরে ব্যবহৃত হয় না।

যথেষ্ট সুক্ষ্ম এবং আমি বুঝতে পারি ... আমি পর্যালোচনা মডিউলটি দিয়ে গিয়েছিলাম ঠিকই মন্তব্য করছি তবে সুন্দর সম্পাদনা করুন এবং ফলোআপ করুন !!
পিম্প জুস আইটি

কীভাবে ifপুনরায় কার্যকর করা যায়?
কামিল ম্যাকিয়েরোভস্কি

শুভ পয়েন্ট কামিল। এটিকে পুনরাবৃত্তি করে লোকে করতে ভুলে গেছেন। ifবিবৃতিতে নিজেকে কল করে একটি ফাংশন ব্যবহার করে সম্পাদনা স্থির করা হয়েছে ।

0

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

  1. একবার টার্মিনালে কমান্ড লিখুন।
  2. মাউস সহ নিউলাইন অক্ষর সহ কমান্ডটি নির্বাচন করুন।
  3. সিটিআরএল-সন্নিবেশ ব্যবহার করে বা প্রসঙ্গ মেনু ব্যবহার করে (সাধারণত ডান ক্লিকের মাধ্যমে অ্যাক্সেস করা হয়) ব্যবহার করে নির্বাচনটি অনুলিপি করুন।
  4. আপনি যতবার কমান্ডটি চালাতে চান ততবার পেস্ট করতে শিফট-সন্নিবেশ ব্যবহার করুন।

প্রতিটি কমান্ড শেষ না হওয়া পর্যন্ত আপনাকে পেস্ট করার জন্য অপেক্ষা করতে হবে না। আটকানো কমান্ডগুলি একটি সারিতে উঠে যায় এবং তারা একের পর এক কার্যকর করে।


0

আমি আজ সাসি লাগছে।

অসীম স্ট্রিমগুলির একটি থেকে পড়ুন এবং এটিকে পাইপ করুন xargs

cat /dev/zero | xargs --null echo hello there

আপনি যদি সেখানে কিছুটা বিরতি রাখতে চান তবে সম্ভবতঃ সম্পাদন করতে হবে sh

cat /dev/zero | xargs --null sh -c "echo hello there && sleep 3"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.