क्या बैश शेल में एक कमांड को रिवर्स करना संभव है?


12

मैं सोच रहा था कि क्या एक सरल (सरल) संभावना है जो बैश शेल में निष्पादित कमांड को फिर से करने / रिवर्स करने की है? (इसे पूर्ववत करने के लिए)

क्या किसी क्रिया को फिर से करने के लिए ctrl+ zसंयोजन के समान कुछ है (उदाहरण के लिए शब्द या लिब्रे ऑफिस में)?


8
संक्षिप्त उत्तर नहीं है। कुछ कमांड को वापस किया जा सकता है, लेकिन सामान्य पूर्ववत ऐसी कोई बात नहीं है।
आर्चेमार

3
जैसा कि दूसरों ने कहा, undoपूरे ऑपरेटिंग सिस्टम का अप-टू-डेट बैकअप होने का कोई आदेश वास्तव में उपयोगी नहीं है। जब कुछ गलत होता है तो आप पिछली स्थिति को बहाल करते हैं। उदाहरण के लिए rsnapshot पर एक नज़र डालें
अरकादिअस ड्रेकज़ीक

1
मैं पड़ाव -p कमांड को पूर्ववत करने का एक रास्ता खोजना चाहता हूं
स्कैपरन

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

2
मैं shutdownआदेश को पूर्ववत करना चाहूंगा .. विश्वास नहीं कर सकता कि इस तरह के प्रश्न एक दिन में 8 अपवोट प्राप्त कर सकते हैं !!
MagExt

जवाबों:


33

आपको समझना चाहिए कि bashसिर्फ एक निष्पादन का माहौल है। यह उन कमांड को निष्पादित करता है जिन्हें आप कॉल करते हैं - यह शेल का व्यवसाय नहीं है यहां तक ​​कि यह भी पता है कि कमांड क्या करता है, आप किसी भी निष्पादन योग्य को कॉल कर सकते हैं। ज्यादातर मामलों में, यह भी स्पष्ट नहीं है कि एक पूर्ववत क्या करेगा - उदाहरण के लिए, क्या आप एक फिल्म "अनप्ले" कर सकते हैं? क्या आप एक ई-मेल "अनसेंड" कर सकते हैं? उदाहरण के लिए, "फ़ायरफ़ॉक्स चलाने वाले पूर्ववत" का क्या अर्थ होगा? आप इसे बंद कर सकते हैं, लेकिन बुकमार्क, डाउनलोड और इतिहास समान नहीं होंगे।

यदि आप एक कमांड चलाते हैं, तो इसे निष्पादित किया जाता है, जो कुछ भी करता है। यह आप पर निर्भर है कि आप क्या कर रहे हैं। ध्यान दें कि इसका मतलब यह नहीं है कि व्यक्तिगत आदेशों में "पूर्ववत" नहीं है ... वे कर सकते हैं - आप एक आवरण फ़ंक्शन भी लिख सकते हैं जो आपको मूर्खतापूर्ण गलतियों से बचाने के लिए कुछ करता है।

उदाहरण के लिए, mvआसानी से प्रतिवर्ती है बस फ़ाइल को वापस उसी स्थान पर ले जाना जहां वह आया था, जब तक कि आपने कुछ अधिलेखित नहीं किया है। इसीलिए -iओवर राइटिंग से पहले आपसे पूछने के लिए स्विच मौजूद है। तकनीकी रूप से, इसका उलटा cpहै rm, जब तक कि कुछ ओवरराइट नहीं किया गया (फिर से, -iइसके बारे में आपसे पूछता है)। rmअधिक स्थायी है, फाइलों को वापस पाने की कोशिश करने के लिए, आपको वास्तव में कुछ निचले स्तर की हैकिंग करनी होगी (इसके लिए उपकरण हैं)। यदि आपने फाइल-सिस्टम को ब्लैक-बॉक्स माना है, तो यह तकनीकी रूप से बिल्कुल भी संभव नहीं होगा (केवल डेटा के तार्किक और भौतिक लेआउट का विवरण आपको कुछ नुकसान नियंत्रण करने की अनुमति देता है)। rmमतलब है rm, अगर आप "कचरा" कार्यक्षमता चाहते हैं, तो यह वास्तव में बस हैmvकुछ पूर्व-व्यवस्थित निर्देशिका में (और संभवतः इसे बनाए रखने या खाली करने के लिए एक अनुसूचित सेवा) - इसके बारे में कुछ खास नहीं। लेकिन आप -iहटाने से पहले आपको संकेत देने के लिए उपयोग कर सकते हैं । आप -iइन आदेशों में हमेशा शामिल करने के लिए एक फ़ंक्शन या अन्य उपनाम का उपयोग कर सकते हैं ।

ध्यान दें कि अधिकांश एप्लिकेशन आपको विभिन्न तरीकों से डेटा हानि से बचा रहे हैं। अधिकांश (~ सभी) पाठ संपादक ~पुराने संस्करण को वापस लाने के मामले में अंत में बैकअप फ़ाइलों को बनाते हैं । कुछ डिस्ट्रोस पर, lsडिफ़ॉल्ट रूप से अलियास किया जाता है ताकि यह उन्हें ( -B) छिपा दे , लेकिन वे वहां हैं। अनुमतियों को ठीक से प्रबंधित करके बहुत अधिक सुरक्षा दी जाती है: जब तक आपको होने की आवश्यकता नहीं है, तब तक रूट न करें, फ़ाइलों को केवल तभी बनाएं जब आप उन्हें बदलना नहीं चाहते। कभी-कभी "सैंडबॉक्स" वातावरण के लिए उपयोगी होता है - आप चीजों को कॉपी पर चलाते हैं, देखें कि क्या यह ठीक है, और फिर परिवर्तनों को मर्ज करें (या परिवर्तनों को छोड़ दें)। chrootया lxcअपनी स्क्रिप्ट को एक निर्देशिका से बचने और नुकसान करने से रोक सकता है।

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

टारबॉल के बोल - तारबॉम्ब्स और ज़िपबॉम्ब्स दुर्भाग्य से काफी आम हैं (जब लोग एक उचित उपनिर्देशिका के बिना एक संग्रह बनाते हैं, और फाइलों को इधर-उधर खिसकाते हैं, एक बड़ी गड़बड़ बनाते हैं)। मुझे सिर्फ अनपैक करने से पहले एक उपनिर्देशिका बनाने की आदत है (मैं सामग्री को सूचीबद्ध कर सकता हूं , लेकिन मैं आलसी हूं)। मैं एक ऐसी स्क्रिप्ट बनाने के बारे में सोच रहा हूं, जो केवल एक उपनिर्देशिका बनाएगी यदि सामग्री को एक उपनिर्देशिका के बिना संग्रहीत किया गया था। लेकिन जब ऐसा होता है, ls -lrtतो सबसे हाल की फ़ाइलों को खोजने में मदद करता है जहां वे हैं। मैंने इसे केवल एक उदाहरण के रूप में दिया - एक कार्यक्रम के कई दुष्प्रभाव हो सकते हैं जिनके बारे में जानने का कोई तरीका नहीं है (यह कैसे हो सकता है? यह एक अलग कार्यक्रम कहा जा रहा है!) गलतियों से बचने का एकमात्र निश्चित तरीका सावधान रहना है (सोचना दो बार, एक बार दौड़ो)।

संभवतः सबसे खतरनाक कमांड्स हैं जो फाइलसिस्टम से निपटते हैं: mkfs, fdisk / gdisk वगैरह। वे फ़ाइल सिस्टम को पूरी तरह से नष्ट कर सकते हैं (हालांकि उचित फोरेंसिक सॉफ़्टवेयर के साथ, कम से कम आंशिक रिवर्स-इंजीनियरिंग संभव है)। कमांड चलाने से पहले हमेशा उस डिवाइस को डबल-चेक करें जिसे आप स्वरूपण और विभाजन कर रहे हैं, सही है।


14

नहीं, बाश में एक "पूर्ववत" जैसी कोई चीज नहीं है, क्षमा करें। यही कारण है कि आपको अपने आदेशों की दोबारा जांच करनी चाहिए या उन्हें पहले महत्वहीन फाइलों पर परीक्षण करना चाहिए (यदि यह संभव है)। और ट्रिपल-चेक करें यदि आप रूट के रूप में चीजें कर रहे हैं;)


1
सीटीआर + / बैश टर्मिनल में कुछ नियंत्रण आदेशों के लिए पूर्ववत करता है, लेकिन सभी आदेश पूर्ववत नहीं हैं।
एरिक लेसिंसकी

@ EricLeschinski क्या आप कोई संदर्भ प्रदान कर सकते हैं?
एरथियल

यह इस पृष्ठ की उत्तर-टिप्पणियों में दफन है: skorks.com/2009/09/bash-shortcuts-for-maximum-productivity इसे काम करने के लिए, टर्मिनल पर कुछ शब्द टाइप करें। किसी वर्ण पर बचे हुए कर्सर को ले जाएँ, चरित्र के तहत डिलीट के लिए Ctrl-d दबाएं, फिर Ctrl + / दबाएं जो डिलीट को अनडू करता है।
एरिक लेसिंस्की

1
ओह, लेकिन यह एक कमांड को पूर्ववत करने से मौलिक रूप से कुछ अलग है। यदि आप किसी फ़ाइल को निकालते हैं rm, तो फ़ाइल चली गई, वह बीत गई, वह मृत हो गई, यह अब और नहीं है, यह एक पूर्व-फ़ाइल (मोंटी पाइथन अलर्ट) है। अब इसके रिश्तेदार दुःख में रो रहे हैं और आप अपने काम को नहीं कर सकते। आप जिस बारे में बात कर रहे हैं वह टाइपिंग या अक्षर हटाना पूर्ववत है और मुझे संदेह है कि यह आपके टर्मिनल एमुलेटर की एक विशेषता है। मैंने इसे टर्मिनेटर में अभी आज़माया है और यह काम करता है। एक अलग कंसोल (मेरे मामले में Ctrl + Alt + F1) पर स्विच करने से यह काम करने की अनुमति नहीं देता है।
एराथिल

निष्पादन पूर्ववत के बाद टर्मिनल कमांड एंट्री पूर्ववत है, और टर्मिनल कमांड। मैं यहां पूर्व की तलाश में आया था।
एरिक लेसिंसकी

11

नहीं, कोई सामान्य पूर्ववत नहीं है, लेकिन कुछ परिणाम दूसरों की तुलना में अधिक प्रतिवर्ती हैं। उदाहरण के लिए लें rm: यह अनिवार्य रूप से दो उद्देश्यों के लिए उपयोग किया जाता है - नई फ़ाइलों के लिए अव्यवस्था और खाली स्थान से परहेज। थोड़े से भाग्य के साथ, आप टूल जैसे उपकरणों का उपयोग करके फ़ाइल की सामग्री को पुनः प्राप्त कर सकते हैं extundelete, क्योंकि फ़ाइल को शुरू करने के लिए केवल पॉइंटर को आपके द्वारा चलाए जाने पर अधिलेखित कर दिया जाता है rm; जब ऑपरेटिंग सिस्टम उस स्थान (जो मिलीसेकंड या वर्षों बाद हो सकता है) का पुन: उपयोग करने पर सामग्री को ओवरराइट कर दिया जाता है। इस कार्यक्षमता के कारण, सिस्टम के पैमाने के rmबीच में कम या ज्यादा विनाशकारी हो जाता है। एक ओर कचरा हैसिस्टम, जो तुरंत डेटा खोने के जोखिम के बिना अव्यवस्था से बचने का एक तरीका प्रदान करते हैं (क्योंकि पूर्ववत है)। यहां तक ​​कि अधिक रूढ़िवादी एक बार लिखे जाते हैं , कई ("WORM") सिस्टम पढ़ते हैं, जहां डेटा को हटाया नहीं जा सकता है या सिस्टम राइटिंग द्वारा इसे ओवरराइट किया जा सकता है । पैमाने के दूसरे छोर पर श्रेडिंग सिस्टम है, जो सूचक के अलावा फ़ाइल सामग्री (आमतौर पर कई बार) को अधिलेखित करता है। उस बिंदु पर आपके डेटा को पुनर्प्राप्त करने की तकनीक शायद अभी तक मौजूद नहीं है (और संभवतः कभी मौजूद नहीं हो सकती)।

तो आप देख सकते हैं कि विशिष्ट उपकरण किस प्रकार सबसे अधिक उपयोग किया जाता है ( rm) एकमात्र विकल्प नहीं है, लेकिन यह एक व्यापार बंद प्रदान करता है जो ज्यादातर लोगों के साथ सहज लगता है:

  • फ़ाइल पॉइंटर को हटाना बहुत तेज़ है, और डिस्क को खराब करने की दिशा में बहुत कम योगदान देता है
  • आप सिस्टम पर अंतरिक्ष से बाहर चलने की संभावना कम कर रहे हैं जो अत्यधिक स्वचालित हैं
  • बहुत मामूली, लेकिन गैर-शून्य, गोपनीयता सुरक्षा प्रदान करता है, और इसके विपरीत, वसूली की गारंटी देता है
  • कम जटिलता और इसलिए बग या अप्रत्याशित व्यवहार की कम संभावना

यदि आपके उपकरण आपके द्वारा किए गए ट्रेड-ऑफ आपके लिए अस्वीकार्य हैं, तो एक नज़र डालें। संभावना है कि वहाँ उपकरण हैं जो निर्णय लेते हैं जो आपके लिए सही हैं


3
इस उत्तर का एकमात्र हिस्सा जो प्रश्न को संबोधित करता है, वह है पहली पंक्ति
अल्वारो

बस यह समझाने की कोशिश कर रहा है कि चीजें इस तरह से क्यों हैं, एक बहुरूपिए दृष्टिकोण से।
l0b0

9

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

शेल में चलाए जा रहे किसी भी कमांड या प्रोग्राम से होने वाले कार्यों को पूर्ववत करने की क्षमता नहीं होगी। यदि कमांड या प्रोग्राम ने एक इतिहास को बनाए रखा और एक पूर्ववत कार्य किया था, तो शायद इसका उपयोग किया जा सकता है, लेकिन शेल स्वयं नहीं कर सकता है।

उदाहरण के लिए, यदि आप चलाते हैं rm important_file.txt, तो वह फाइलसिस्टम ड्राइवर को फाइलसिस्टम पर फाइल को "अनलिंक" करने के लिए कहेगा। शेल कार्रवाई नहीं करता है, यह केवल कॉल rmकरता है जो करता है।

खोई हुई फ़ाइल को हटाना रद्द करने की इच्छा के मामले में, ऐसा करना संभव हो सकता है, क्योंकि आमतौर पर फ़ाइल को हटाने से वास्तव में इसे हटाया नहीं जाता है, लेकिन यह केवल संदर्भ को हटा देता है। एक समय के बाद, फ़ाइल की सामग्री को अधिलेखित कर दिया जाएगा क्योंकि अन्य डेटा डिस्क पर सहेजा जाता है, लेकिन थोड़ी देर के लिए उपयोगिताओं का उपयोग करने वाली मूल फ़ाइल को पुनर्स्थापित किया जा सकता है जो इसे ढूंढ और "राहत" कर सकता है।


1

नहीं, लेकिन ऐसा नहीं है, लेकिन यदि आप कहते हैं कि आपने किसी विशेष विशेषाधिकार वाली निर्देशिका के साथ खिलवाड़ किया है और किसी तरह कुछ खराब किया है, तो आपकी सबसे अच्छी शर्त यह है कि आप USB ड्राइव या SD कार्ड की सभी फाइलों को सहेज लें और अपने ऑपरेटिंग सिस्टम को रीसेट कर दें। आईएसओ फ़ाइल (यदि आपके पास अभी भी है, तो आप एक और ऑफ़लाइन प्राप्त कर सकते हैं ...)। यदि आप कुछ हटा सकते हैं, तो जैसा कि रेनेथ ने कहा है, फ़ाइल डेटा को फ़ाइलनाम में वापस करने के लिए एक एप्लिकेशन डाउनलोड करें और फाइल की सामग्री को सहेजा है (यह प्रश्न यहां देखें )। अधिक गहराई से उत्तर के लिए, क्या आप हमें बता सकते हैं कि आपने क्या गलत किया?


1

मैं दूसरों की कही गई बातों को नहीं दोहराऊंगा, लेकिन मैं देख सकता हूं कि आप कहां से आ रहे हैं। "खतरनाक" आदेशों को निष्पादित करने के लिए मेरा मानक दृष्टिकोण हमेशा उन्हें यह देखने के लिए प्रतिध्वनित किया गया है कि सभी चर ठीक से विस्तारित हो या नहीं। यदि आप कुछ विशिष्ट उदाहरणों को उद्धृत कर सकते हैं, तो हम आगे मदद करने में सक्षम हो सकते हैं।

उदाहरण के लिए, ऐसी स्थिति में:

for i in $(cat /my/file); 
do 
   echo "Now removing file $i using rm -f $i"
done

1

अन्य अच्छे उत्तरों की तरह कहा: शेल में कोई "पूर्ववत" नहीं है। लेकिन आपके विशिष्ट उपयोग के मामले में, पूर्ववत करने के लिए shutdown, आप शटडाउन प्रक्रिया को मार सकते हैं: /programming//a/26263030 देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.