बैश में समाप्त होने पर एक कमांड को लगातार निष्पादित करें


62

मैं किसी भी कारण (त्रुटि या अन्यथा) के पूरा होने पर एक कमांड को फिर से निष्पादित करने का एक सरल तरीका जानने की कोशिश कर रहा हूं।

इसके लिए सबसे अच्छा तरीका क्या होगा?

संपादित करें: मैं पहले पर्याप्त स्पष्ट नहीं था। पिछले एक खत्म होने तक इंतजार करने के लिए मुझे अगले निष्पादन की आवश्यकता है ।

संपादित 2: लगभग सभी उत्तर महान काम करते हैं। मैंने गलती से सोचा था कि अधिकांश उत्तर या तो प्रक्रिया को कांटा कर देंगे या इसे केवल एक बार फिर से निष्पादित करेंगे, जिनमें से कोई भी नहीं चाहता है।

linux  bash 

1
आप अभी भी स्पष्ट नहीं हैं। यदि आप जिस प्रोग्राम का निष्पादन कर रहे हैं, उसका उल्लेख करने पर यह मदद करेगा।
डैनियल बेक

1
-1 यह सवाल कोई शोध प्रयास नहीं दिखाता है, क्योंकि उपयोगकर्ता ने टिप्पणी की थी कि उत्तर वास्तव में वे क्या करने की कोशिश कर रहे हैं इसके बजाय काम नहीं किया।
डैनियल बेक

जवाबों:


39

यह एक अनंत लूप बनाता है, commandबार-बार निष्पादित होता है।

while :
    do
        command
done

कृपया मूल प्रश्न का संपादन देखें। मुझे केवल एक बार नहीं, बार-बार इसे निष्पादित करना होगा।

8
@calcifer यह उत्तर काफी अच्छी तरह से काम करता है। आपके कार्यक्रम के बारे में कुछ असामान्य है कि चार उपयोगकर्ताओं में से कोई भी अब तक प्रत्याशित नहीं है और आप इसका उल्लेख करने में विफल रहे हैं।
डैनियल बेक

@calcifer यह एक अनंत लूप है। यह समय के अंत तक अच्छी तरह से दोहराता रहता है (अच्छी तरह से, जब तक स्क्रिप्ट को समाप्त नहीं किया जाता है)
नैट कोपेनहेवर

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
अब तक के सभी उत्तर ऐसा है, जिसमें यह भी शामिल है। जब तक आप इसे विशेष रूप से नहीं पूछेंगे, तब तक लिनक्स कांटा नहीं होगा।
पॉल

मुझे नहीं पता था कि कांटा के बारे में, धन्यवाद।

मैं इस पद्धति का उपयोग करके कोई भी आउटपुट नहीं देख सकता।
रफी खाचदौरेन

@RaffiKhatchadourian क्या आप कह रहे हैं कि यदि आप watch lsएक निर्देशिका में करते हैं जिसमें फाइलें होती हैं, तो आपको कुछ नहीं मिलता है?
पॉल

17

एक सरल समाधान होगा:

yourcommand; !#

;अलग-अलग कमांड, एक लाइन में कई कमांड के लिए अनुमति देता है ( बैश: सूची )

!#"इस पंक्ति में अब तक मैंने जो कुछ भी लिखा है, उसे दोहराने के लिए बैश बताता है" ( बैश: इवेंट-डिज़ाइनर )


1
क्षमा करें, मैं पर्याप्त स्पष्ट नहीं था। मुझे केवल एक बार नहीं, बार-बार इसे निष्पादित करना होगा।

इसके लिए धन्यवाद, मैं इसे ढूंढ रहा था, खासकर जब से yourcommand; !!वास्तव में एक ही लाइन पर कमांड के साथ काम नहीं करता है, हालांकि, !#ऐसा लगता है। चीयर्स!
सादाऊ

; !#ZSH पर काम नहीं किया, यह सिर्फ बयान का
वर्णन

7

आप कमांड निष्पादन के दौरान आगे की योजना बना सकते हैं (बशर्ते कि यह इंटरैक्टिव नहीं है) और दर्ज करें !!जो पिछले कमांड को फिर से निष्पादित करेगा। इस दौरान काम करता है 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
@calcifer ये निष्पादन तब तक प्रतीक्षा करते हैं जब तक कि प्रोग्राम कॉल न लौटे। क्या आपका प्रोग्राम शेल से अलग होता है और क्विट होने से पहले लौटता है?
डैनियल बेक

मेरा बुरा, मैंने सोचा कि यह (और अन्य सभी उत्तर) या तो प्रक्रिया को कांटा जाएगा या इसे केवल एक बार फिर से निष्पादित करेगा, जिसमें से कोई भी नहीं चाहता था। तो हाँ, यह जवाब काम करता है। धन्यवाद।

4

एक whileलूप को बूलियन स्थिति दें जैसे कि:

#!/bin/bash

while true; do

    do_something && wait

done

यह तब तक खत्म हो जाएगा जब तक bash प्रक्रिया को समाप्त करने के लिए एक संकेत प्राप्त नहीं कर लेता। आमतौर पर के रूप में ctrl+c

watchस्क्रिप्ट को बार-बार चलाने के लिए भी आप कमांड का उपयोग कर सकते हैं । उदाहरण के लिए, अपने बैश टर्मिनल में एक साधारण घड़ी का उपयोग करके watchदेख सकते हैं:

$ watch -t -n1 date +%T

-tविकल्प बताता watchप्रक्रिया वह चल रहा है की एक शीर्षक प्रदर्शित नहीं करने के लिए। यह आपको केवल उस कमांड का एक साफ आउटपुट देता है जिसे दोहराया जा रहा है। -n1विकल्प हर दोहराने के लिए देखने के लिए कहता है nसेकंड। इस मामले में, दूसरे का -n1अंतराल होगा 1। फिर date +%Tकमांड कमांड पूरा होने के समय को दिखाता है। इस कमांड को करने से आपको अपने टर्मिनल में एक सक्रिय घड़ी मिलेगी।

और फिर एक और विधि जो अन्य उत्तरों में से किसी में नहीं है, एक अनंत फ़ंक्शन कॉल होगी।

do_something() { do_something }; do_something && wait

यह अनिवार्य रूप से बूलियन whileलूप केवल पुनरावर्ती फ़ंक्शन कॉल का उपयोग करने के समान है ।

(संपादित करें) आपकी मशीन के संसाधनों को ध्यान में रखते हुए, मैंने यह जोड़ा है && waitकि हर बार जब कोई प्रक्रिया चलती है, तो लूप "प्रतीक्षा" करेंगे जब तक कि अगली पुनरावृत्ति से पहले यह प्रक्रिया निकास स्थिति 0 के साथ समाप्त न हो जाए। यह एक इंटरैक्टिव शेल स्क्रिप्ट में उपयोगी है।


1
एक whileलूप उदाहरण है, लेकिन यह बूलियन trueसिंटैक्स का उपयोग नहीं कर रहा है । एक watchउदाहरण है, लेकिन यह कई उपयोगी वाक्यविन्यास नहीं देता है। मैं जिस पर मदद कर सकता हूं, उसके लिए इन पर विस्तार कर रहा हूं। मैं इनको कुछ व्यावहारिक उपयोगिता देना चाहता था। whileपाश बूलियन भी हो सकता है falseऔर निष्पादित नहीं जब तक एक झूठ की स्थिति उत्पन्न होने। यह काफी आसान है।

1
@ Spittin'IT एक ऐसा तरीका है जो आपकी सुविधा के लिए अन्य उत्तरों में उपयोग नहीं किया जाता है।

निष्पक्ष रूप से पर्याप्त और मैं समझता हूं ... मैं समीक्षा कर रहा था क्योंकि मैं समीक्षा मॉड्यूल के माध्यम से गया था, लेकिन अच्छा संपादन और अनुवर्ती !!
दलाल रस आईटी

ifपुन: क्रियान्वयन कैसे होता है ?
कामिल मैकियोरोस्की

अच्छी बात है कामिल। यह पुनरावर्ती योग्य बनाने के लिए भूल गया। किसी फ़ंक्शन का उपयोग करके ifकथन में स्वयं को संपादित करने में निश्चित ।

0

यह एक और तरीका है जिसका उपयोग मैं बैश में एक कमांड दोहराने के लिए करता हूं। यह कुछ के लिए मूर्खतापूर्ण लग सकता है क्योंकि इसमें स्क्रिप्ट लिखना शामिल नहीं है और कई लोगों को पता हो सकता है। लेकिन मुझे लगता है कि यह ध्यान देने योग्य है क्योंकि यह त्वरित और शुरुआती-अनुकूल है, इस अर्थ में कि याद करने के लिए बहुत अधिक वाक्यविन्यास नहीं है। मैंने केवल उबंटू के सूक्ति-टर्मिनल में इसका परीक्षण किया है और अन्य टर्मिनल इसका समर्थन नहीं कर सकते हैं।

  1. एक बार टर्मिनल में कमांड दर्ज करें।
  2. माउस के साथ newline वर्ण सहित कमांड का चयन करें।
  3. Ctrl-Insert का उपयोग करके या संदर्भ मेनू का उपयोग करके चयन की प्रतिलिपि बनाएँ (आमतौर पर राइट क्लिक से एक्सेस किया जाता है)।
  4. जितनी बार आप कमांड चलाना चाहते हैं, उतनी बार पेस्ट-इंसर्ट करें।

जब तक प्रत्येक कमांड समाप्त न हो जाए, आपको चिपकाने का इंतजार नहीं करना पड़ेगा। चिपकाई गई कमांड एक कतार में आती हैं और वे एक के बाद एक निष्पादित होती हैं।


0

मुझे आज नीद आ रही है।

अनंत धाराओं में से एक से पढ़ें और इसे पाइप करें xargs

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

यदि आपको वहां थोड़ा सा ब्रेक लगाने की आवश्यकता है, तो आपको निष्पादित करने की आवश्यकता होगी sh

cat /dev/zero | xargs --null sh -c "echo hello there && sleep 3"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.