rm -rf रिटर्न कोड


9

कोई भी मुझे कमांड आरएम -rf के लिए संभावित रिटर्न कोड के अलावा शून्य यानी संभावित विफलता कोड के लिए संभावित रिटर्न कोड की जानकारी दे सकता है। मैं कमांड की विफलता के लिए और अधिक विस्तृत कारण जानना चाहता हूं, केवल कमांड विफल होने के विपरीत (वापसी 0 के अलावा अन्य)।

shell  unix 

3
@ SurprisedHankyPankyØ मैं वास्तव में आश्चर्यचकित हूं कि rm manpage संभावित निकास स्थिति कोड का वर्णन नहीं करता है। यदि आप man lsउबंटू पर हैं, तो यह
नॉनजेरो

इसका मान 0 से अधिक है। त्रुटि के मामले में।
अरुण

6
मैं SO से माइग्रेशन से असहमत हूं, क्योंकि ओपी को रिटर्न कोड्स में दिलचस्पी है इसलिए बहुत संभावना है कि यह एक स्क्रिप्टिंग / प्रोग्रामिंग तरह का इश्यू हो।
एड्रियन फ्रुविर्थ

वैसे, मैं उस परिदृश्य की संख्या पर रुचि रखता हूं जो इसे वापस कर सकता है। क्या यह ओएस पर निर्भर होगा?

थोड़े खुद प्रवास के बारे में नाराज ... लगभग उलट उपलब्धि हासिल की = पी
मैट जॉयस

जवाबों:


8

रिटर्न कोड देखने के लिए, आप echo $?बैश में उपयोग कर सकते हैं ।

वास्तविक अर्थ देखने के लिए, कुछ प्लेटफार्मों (जैसे डेबियन लिनक्स) में perrorबाइनरी उपलब्ध है, जिसका उपयोग निम्नानुसार किया जा सकता है:

$ rm -rf something/; perror $?
rm: cannot remove `something/': Permission denied
OS error code   1:  Operation not permitted

rm -rfस्वचालित रूप से अधिकांश त्रुटियों को दबा देता है। आपके द्वारा देखी जाने वाली सबसे संभावित त्रुटि है 1(ऑपरेशन की अनुमति नहीं), जो तब होगा जब आपके पास फ़ाइल को निकालने की अनुमति नहीं होगी। -fजानबूझकर अधिकांश त्रुटियों को दबा देता है


3
उल्लेख करने के लिए +1 perror। मेरे सिस्टम पर यह mysql के साथ जहाज जाता है।
एड्रियन फ्रुविर्थ

डायग्नोस्टिक्स के संदर्भ में स्ट्रेस के साथ बेहतर भाग्य हो सकता है।
मैट जॉयस

@MattJoyce straceआपको बताता है कि क्या कोई सिस्टम कॉल विफल हो जाता है, लेकिन जब तक आप उस स्रोत को नहीं देखेंगे जो आपको नहीं पता है कि syscall प्रोग्राम से बाहर निकलने की स्थिति से कैसे संबंधित है (उदाहरण के लिए, यदि आप चलाते हैं -f, ENOENTतो दबा हुआ है)। इसलिए यहां प्रासंगिक नहीं है
शीटजेएस

1
@MattJoyce syscall फेल होने और प्रोग्राम को एरर देने के बीच अंतर होता है, और सवाल प्रोग्राम एग्जिट स्टेटस के बारे में पूछ रहा है।
शीटजेएस

1
सच। मन आप आरएम के लिए स्रोत को देख रहे हैं ... वहाँ वास्तव में बहुत कुछ नहीं चल रहा है।
मैट जॉयस

2

पकड़ से coreutils पकड़ा ...।

बाहर निकलने पर हम देखते हैं ...

openfly@linux-host:~/coreutils/src $ cat rm.c | grep -i exit
  if (status != EXIT_SUCCESS)
  exit (status);
  /* Since this program exits immediately after calling 'rm', rm need not
  atexit (close_stdin);
          usage (EXIT_FAILURE);
        exit (EXIT_SUCCESS);
          usage (EXIT_FAILURE);
        error (EXIT_FAILURE, errno, _("failed to get attributes of %s"),
        exit (EXIT_SUCCESS);
  exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);

अब स्टेटस वेरिएबल को देखिए…।

openfly@linux-host:~/coreutils/src $ cat rm.c | grep -i status
usage (int status)
  if (status != EXIT_SUCCESS)
  exit (status);
  enum RM_status status = rm (file, &x);
  assert (VALID_STATUS (status));
  exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);

ऐसा लगता है कि बाहर निकलने की स्थिति के साथ वहाँ बहुत कुछ नहीं चल रहा है।

मुझे EXIT_FAILURE और EXIT_SUCCESS दिखाई देता है और कुछ नहीं।

इसलिए मूल रूप से 0 और 1 / -1

विशिष्ट निकास () syscalls को देखने के लिए और वे एक प्रक्रिया प्रवाह में कैसे होते हैं यह प्रयास करें

openfly@linux-host:~/ $ strace rm -rf $whatever 

काफी सरल।

संदर्भ:

http://www.unix.com/man-page/Linux/EXIT_FAILURE/exit/


समझ नहीं आता क्यों, मुझसे +1। POSIX भी केवल वास्तव में कहता है 0 / >0
एड्रियन फ्रुविर्थ

2
हालांकि यह आंशिक रूप से सही हो सकता है लेकिन यह ओपी प्रश्न का उत्तर नहीं देता है I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)इसलिए नीचे के वोट समझ में आते हैं।
प्रिक्स

1
@ AdrianFrühwirth EXIT_FAILURE 1 है: "POSIX सिस्टम पर, इस मैक्रो का मान 1 है" ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS

EXIT_FAILURE के लिए एड्रियन रेफरी है और यहां तक ​​कि इसके लिए लिनक्स मेनपेज भी बताता है कि यह अन्य प्लेटफार्मों पर अलग हो सकता है। इसलिए मुझे लगा कि मैं भी सुझाव दूंगा।
मैट जॉयस

1
आपके द्वारा खोजे जा रहे विफलता संदेश वास्तविक हटाए गए फ़ाइल कोड में हैं ... व्यस्त बॉक्स के लिए आप git.busybox.net/busybox/tree/libbb/remove_file.c को पैच कर सकते हैं ... प्रत्येक if (!(flags & FILEUTILS_FORCE)) {जोड़ने के लिए else{printf("same error message as perror");}मुझे यकीन है कि अन्य कार्यान्वयन हैं समान हो, लेकिन अगर व्यस्त संस्करण को अपने दम पर नहीं बनाया जा सकता है और शामिल किया गया है।
टेक्नोसॉरस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.