चेतावनी या त्रुटि होने पर मुझे प्रोग्राम का नाम आउटपुट करना चाहिए?


13

अगर मैं कोई स्क्रिप्ट या प्रोग्राम लिख रहा हूं, तो क्या मुझे चेतावनी या त्रुटि संदेश के साथ उसके नाम को एक साथ लाने के लिए आउटपुट करना चाहिए? उदाहरण के लिए:

./script.sh: Warning! Variable "var" lowered down to 10.

या:

./prog.py: Error! No such file: "file.cfg".

मैं समझता हूं कि आम तौर पर यह केवल स्वाद का मामला है (विशेषकर यदि आप अपने लिए अपना सामान लिखते हैं), लेकिन मुझे आश्चर्य है कि क्या इसमें कुछ पारंपरिक है? मेरा मानना ​​है कि अधिकांश यूनिक्स / लिनक्स यूटिलिटीज कुछ होने पर अपना नाम लिखते हैं, इसलिए यह एक अच्छी बात लगती है, लेकिन क्या कोई दिशानिर्देश या नियम हैं कि यह कैसे करना है और कैसे नहीं?

उदाहरण के लिए, बायनेरिज़ को अंडरस्टैंड करना उचित नहीं है /usr/bin/, बल्कि अंडर /usr/local/bin/या कुछ और। क्या stderr के आउटपुट के बारे में समान नियम हैं? क्या मुझे एक उपनिवेश के बाद नाम लिखना चाहिए? या सिर्फ "चेतावनी!" और "त्रुटि!" शब्दों? मुझे कुछ भी नहीं मिला लेकिन शायद कोई मुझे इसके बारे में पढ़ने के लिए कह सकता है।

यह सवाल प्रोग्रामिंग प्रथाओं के बारे में एक सा है, लेकिन मैंने सोचा कि यह बजाय पर की तुलना में यहाँ और अधिक उपयुक्त है stackoverflow , के रूप में यह यूनिक्स / लिनक्स परंपराओं के बारे में है और सामान्य रूप में प्रोग्रामिंग नहीं।


5
प्रोग्राम का नाम एक यादृच्छिक no such fileको डीबग करने में सहायता कर सकता है , जो जानता है कि foo | bar | bazपाइप लाइन में कौन सा प्रोग्राम है ।
21

@thrig धन्यवाद, अच्छी बात है। मेरा पाइप नहीं होना चाहिए, लेकिन कौन जानता है। लगता है कि मानक व्यवहार से चिपके रहना बेहतर है।
गसारत

जवाबों:


16

C प्रोग्राम में दिए गए 0 वें तर्क को सहेजना mainऔर perrorसाधारण प्रोग्राम के लिए पैरामीटर के रूप में इसका उपयोग करना आम बात है :

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char *foo = malloc(9999999999L);
    if (foo == 0)
        perror(argv[0]);
    return 0;
}

उस प्रोग्राम को "फू" कहें, और इसे चलाने से बिंदु का चित्रण होता है:

> ./foo
./foo: Cannot allocate memory

जटिल कार्यक्रम पाठ में जोड़ सकते हैं (या पथ के बिना केवल फ़ाइल नाम का उपयोग करें), लेकिन कार्यक्रम का नाम रखने से आप यह पता लगा सकते हैं कि दुर्व्यवहार कार्यक्रम कहां से आया है।

त्रुटि संदेशों के लिए कोई सार्वभौमिक रूप से स्वीकृत योजना नहीं है, लेकिन कुछ व्यापक रूप से उपयोग किए जाने वाले कार्यक्रम (जैसे कि जीसीसी) एक संदेश श्रेणी जैसे "त्रुटि" या "चेतावनी" जोड़ते हैं। यहाँ मेरे बिल्ड-लॉग में से एक उदाहरण दिया गया है:

compiling fld_def (obj_s)
../form/fld_def.c: In function '_nc_Copy_Argument':
../form/fld_def.c:164:14: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
        res = (TypeArgument *)argp;
              ^

इस उदाहरण में, gcc कॉलन के साथ फ़ील्ड्स को अलग करता है और फ़ाइल नाम, लाइन नंबर, कॉलम नंबर - और वास्तविक संदेश से पहले एक श्रेणी "चेतावनी" जोड़ता है। लेकिन कई भिन्नताएं हैं, जो सूचनाओं को पार्स करने के लिए कार्यक्रमों (जैसे vi-like-emacs ) के लिए जटिल बनाती हैं।

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


एक उदाहरण के लिए धन्यवाद, मुझे बात मिलती है। क्या "त्रुटि" और "चेतावनी" के बारे में, क्या वे अव्यवस्था उत्पादन करते हैं?
गसरेट

आपका अंतिम संपादन - वास्तव में मैं क्या सोच रहा था! वैसे भी अगर सही संदेश के बाद यह सही निकलता है तो क्या उपयोग होता है? एक बार फिर धन्यवाद।
गसरेट

8

यदि किसी प्रोग्राम को एक स्क्रिप्ट के हिस्से के रूप में आमंत्रित किया जाता है, जिसमें कई अन्य कार्यक्रमों को आमंत्रित किया जाता है, और यदि यह अपना नाम नहीं छापता है, तो उपयोगकर्ता यह पता लगाने के लिए कठिन (एर) पाएंगे कि त्रुटि कहां से आ रही है।

(यदि त्रुटि कुछ अप्रत्याशित आंतरिक स्थिति है जिसमें डीबगिंग की आवश्यकता हो सकती है, तो आप और भी अधिक जानकारी चाहते हैं: न केवल प्रोग्राम का नाम, बल्कि एक स्रोत फ़ाइल और लाइन नंबर और संभवतः एक बैकट्रेस।)


धन्यवाद। मैं आमतौर पर खुद के लिए कार्यक्रम (संख्यात्मक सिमुलेशन) लिखता हूं, इसलिए केवल एक उपयोगकर्ता है, हालांकि मैं उन्हें एक दिन साझा कर सकता हूं। वे भी उस जटिल नहीं हैं (ठीक है, कम से कम अभी तक) इसलिए त्रुटि का स्रोत खोजने में कोई समस्या नहीं है, लेकिन संकेत के लिए धन्यवाद, भविष्य में उपयोगी हो सकता है।
gsarret
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.