यूनिक्स कमांड जो तुरंत एक विशेष रिटर्न कोड लौटाता है?


28

क्या एक मानक यूनिक्स कमांड है जो नीचे मेरे उदाहरण के समान कुछ करता है

$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$

<cmd here>कुछ ऐसा होना चाहिए जो कांटा-निष्पादित हो सकता है और प्रक्रिया से बाहर निकलने पर 56 को बाहर निकलने के कोड के रूप में छोड़ देता है। exitऔरreturn खोल builtins मैं क्योंकि वे प्रेरक खोल ही को प्रभावित करने के लिए क्या देख रहा हूँ इसे से बाहर निकल कर के लिए अनुपयुक्त हैं। <some cmd>कुछ ऐसा होना चाहिए जिसे मैं गैर-शेल संदर्भों में निष्पादित कर सकूं - जैसे, पायथन स्क्रिप्ट से subprocess

जैसे, /usr/bin/falseहमेशा रिटर्न कोड 1 के साथ तुरंत बाहर निकलता है, लेकिन मैं वास्तव में उस रिटर्न कोड को नियंत्रित करना चाहता हूं। मैं अपनी स्वयं की आवरण स्क्रिप्ट लिखकर वही परिणाम प्राप्त कर सकता था

$ cat my-wrapper-script.sh # i.e., <some cmd> = ./my-wrapper-script.sh
#!/usr/bin/bash
exit $1
$ ./my-wrapper-script.sh 56
$ echo $?
56

लेकिन मुझे उम्मीद है कि एक मानक यूनिक्स कमांड मौजूद है जो मेरे लिए ऐसा कर सकता है।


10
exitकेवल वही है जिसके बारे में मैं सोच सकता हूं, लेकिन यह आपके खोल को समाप्त कर देता है। bash -c 'exit 56'या bash -c "exit $1"आपके लिए काम कर सकता है।
टिम कैनेडी

12
कैसे के बारे में (exit 56)?
कोउंगलम

6
यह वास्तव में एक XYProblem की तरह लगता है : इसका अंतिम लक्ष्य क्या है? आपको एक कमांड की आवश्यकता क्यों है जो आपके द्वारा दिए गए नंबर से बाहर निकलें कोड के रूप में वापस आती है?
ओलिवियर दुलैक

1
ठीक है, तुम हो trueऔर falseबनाया-इन यदि आप 0 या 1. वापस जाने के लिए की जरूरत है
gardenhead

1
संबंधित: (गैर पोर्टेबल) एक संकलन-समय निश्चित मान वापस करने के लिए सबसे छोटा कार्यक्रम: muppetlabs.com/~breadbox/software/tiny/teensy.html
फ्लोरियन कास्टेलन

जवाबों:


39
  1. एक returnआधारित फ़ंक्शन काम करेगा, और एक और शेल को खोलने और बंद करने की आवश्यकता से बचा जाएगा, ( टिम कैनेडी की टिप्पणी के अनुसार ):

    freturn() { return "$1" ; } 
    freturn 56 ; echo $?

    आउटपुट:

    56
  2. exitएक उपखंड में उपयोग करना :

    (exit 56)

    के अलावा अन्य गोले के साथ ksh93, इसका मतलब है कि अतिरिक्त प्रक्रिया के लिए फोर्किंग करना उपरोक्त से कम कुशल है।

  3. bash/ zsh/ ksh93केवल चाल:

    . <( echo return 56 )

    (यह भी एक अतिरिक्त प्रक्रिया का अर्थ है (और एक पाइप के साथ आईपीसी))।

  4. zshलंबोदर कार्य:

    (){return 56}

अच्छा विचार। दुर्भाग्य से, मेरे मूल प्रश्न को अच्छी तरह से परिभाषित नहीं किया गया था - "मुझे एक और खोल और बंद करने की आवश्यकता" लगभग एक आवश्यकता थी जो मैं करना चाहता था। मैंने अपने प्रश्न को संपादित करने की आवश्यकता की है जो कि <some cmd>एक निष्पादित () - सक्षम चीज है।
क्रिस

2
@ क्रिस: किसी भी शेल कमांड के लिए आप इसे परिवर्तित कर सकते हैं () इसे करने में सक्षम/bin/sh -c ...originalcommand...
psmears

3
मैं हल्के से निराश हूँ? = 56 काम नहीं करता है।
जोशुआ

@ जोशुआ: शायद यह करता है? लेकिन तब यह प्रभाव सफल था, और आपके पास $ है? 0 पर सेट ...;)
ओलिवियर दुलैक

@ ऑलिवरडुलक: यह नहीं है। यह एक पार्स त्रुटि करता है।
जोशुआ

17

केवल एक विशिष्ट मूल्य वापस करने के लिए कोई मानक UNIX आदेश नहीं है। GNU कोर यूटिलिटीज केवल trueऔर falseकेवल प्रदान करती हैं ।

हालाँकि, आप आसानी से इसे स्वयं कार्यान्वित कर सकते हैं ret:

#include <stdlib.h>
int main(int argc, char *argv[]) {
  return argc > 1 ? atoi(argv[1]) : 0;
}

संकलित करें:

cc ret.c -o ret

और भाग खड़ा हुआ:

./ret 56 ; echo $?

प्रिंटों:

56

यदि आपको हर जगह काम करने की आवश्यकता है (जहां बैश उपलब्ध है, वह है) बिना किसी अतिरिक्त उपकरण को स्थापित किए, तो आपको संभवतः निम्न कमांड का सहारा लेना होगा क्योंकि @TimKennedy टिप्पणियों में सुझाया गया है:

bash -c 'exit 56'

ध्यान दें कि रिटर्न मानों की वैध सीमा 0..255 समावेशी है


1
trueऔर falseयूनिक्स (और यहां तक ​​कि POSIX) में भी हैं, न केवल GNU में।
स्टीफन चेज़लस

@ StéphaneChazelas कि बाहर इशारा करने के लिए धन्यवाद। जैसा कि ओपी ने उल्लेख किया है, मैंने किसी तरह जीएनयू ग्रहण किया - भले ही यह सवाल खुद 'यूनिक्स' बताता हो।
tmh

14

यदि आपको एक्जिट स्टेटस की जरूरत है तो एक एक्जीक्यूटेड कमांड्स द्वारा सेट किया जाना चाहिए। उस 1 के लिए कोई समर्पित आदेश नहीं है , लेकिन आप किसी भी भाषा के दुभाषिया का उपयोग कर सकते हैं जो एक मनमाना निकास स्थिति के साथ बाहर निकलने की क्षमता रखता है। shसबसे स्पष्ट है:

sh -c 'exit 56'

अधिकांश shक्रियान्वयनों के साथ , यह 0 से 255 तक कोड से बाहर निकलने तक सीमित है ( shअधिक से अधिक मूल्यों को स्वीकार करेगा लेकिन इसे कम कर सकता है या यहां तक ​​कि सिग्नल को प्रक्रिया निष्पादित करने के लिए भेजा जा सकता है।sh कोड 257 से 320 के लिए कोड ksh93 के साथ )।

एक एक्ज़िट कोड कोई भी पूर्णांक ( int) मान हो सकता है लेकिन ध्यान दें कि आपको इसे waitid()इंटरफ़ेस से पुनः प्राप्त करने की आवश्यकता है ताकि मान 8 बिट्स (लिनक्स पर नहीं, यह अभी भी साथ waitid()ही छोटा हो गया है) को छोटा नहीं किया गया है। इसलिए 255 से ऊपर के एक्ज़िट कोड (सामान्य ऑपरेशन के लिए 0-123 का उपयोग करें) का उपयोग करना दुर्लभ (और अच्छा विचार नहीं) है।

वैकल्पिक रूप से:

awk 'BEGIN{exit 56}'
perl -e 'exit 56'
python -c 'exit(56)'
expect -c 'exit 56'

(उन 8 बिट्स के लिए बाहर निकलें कोड काट नहीं है)।

NetBSD के साथ find, आप कर सकते हैं:

find / -exit 56

1exit ऐसा करने के लिए मानक कमांड है, लेकिन शेल विशेष बिल्डिन होने के नाते , कोई आवश्यकता नहीं है कि फ़ाइल सिस्टम में उस नाम से एक कमांड भी हो जैसे कि नियमित रूप से निर्मित-इन्स के लिए, और अधिकांश सिस्टम में एक शामिल नहीं होगा


3
/* Public domain, http://creativecommons.org/publicdomain/zero/1.0/ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char **argv) {
    if(!strcasecmp(argv[0],"true")) return 0;
    else if (!strcasecmp(argv[0],"false")) return 1;
    else if(argc<2) {fputs("One argument required\n",stderr);return 1;}
    else if(!strcasecmp(argv[argc-1],"true")) return 0;
    else if(!strcasecmp(argv[argc-1],"false")) return 1;
    else return atoi(argv[argc-1]);
}

इसे एक फाइल में सेव करें जिसका नाम है returncode.cऔरgcc -o returncode returncode.c


एक अर्ध-संबंधित नोट पर: 1) अपने आप को नामांकित किए बिना CC0 लाइसेंस लागू करना शायद एक अच्छा विचार नहीं है, और आपको इसे इस तरह करना चाहिए , 2) इस छोटे से कार्यक्रम आपके कॉपीराइट के मामले के लिए बहुत तुच्छ हैं, इसलिए आप साथ ही लाइसेंस छोड़ सकता है।
राइमॉइड

2
(1) मुझे समझ में नहीं आता कि आप argv[argc-1]इसके बजाय का उपयोग क्यों कर रहे हैं argv[1], और यदि आप शिकायत क्यों नहीं कर रहे हैं argc>2। (2) मैं argv[1]परीक्षण से पहले परीक्षण करने के लिए इच्छुक हूं argv[0], जिससे उपयोगकर्ता को इसके बजाय true 56या कहने की अनुमति मिलती false 56है returncode 56। आप एक संदेश नहीं देते हैं अगर argv[0]एक शब्द है और argc>0- जो भ्रामक हो सकता है। (3) मैं उपयोगकर्ता-मित्रता से ग्रस्त हूं, इसलिए मैं strcasecmpइसके बजाय उपयोग करूंगा strcmp। (4) मैं मापदंडों को मान्य करता हूं, और atoiइसे सत्यापित किए बिना रिटर्न मान का उपयोग नहीं करता। इस तरह के एक 2 a कार्यक्रम के लिए, मुझे लगता है कि यह कोई फर्क नहीं पड़ता।
जी-मैन ने

@ जी-मैन न तो trueहै और न ही falseLinux सिस्टम में किसी भी तर्क को संसाधित करता है
ThePiercingPrince

ठीक है, यह सही है - वे किसी भी तर्क को संसाधित नहीं करते हैं, जिसमें शामिल हैं argv[0]; कार्यक्रम /bin/trueऔर /bin/falseहार्ड कोडित निकास कोड के साथ विभिन्न निष्पादन योग्य हैं। आपने एक प्रोग्राम लिखा है जिसे दोनों ( trueऔर falseलिंक) के रूप में स्थापित किया जा सकता है , जो कि चतुर है। लेकिन सवाल पूछता है कि उपयोगकर्ता द्वारा निर्दिष्ट निकास स्थिति कैसे प्राप्त करें। आपका कार्यक्रम उस प्रश्न का उत्तर देता है, लेकिन केवल अगर यह एक अलग फ़ाइल नाम के तहत स्थापित है। जब तक आप किसी argvभी तरह से देख रहे हैं , मेरा मानना ​​है कि यह करने का तरीका मुझे सुझाव देता है कि तीसरे लिंक की आवश्यकता को टालकर, चतुराई के स्तर को बनाए रखेंगे।
जी-मैन ने

0

मुझे पूरी तरह से यकीन नहीं था कि अगर exitकमांड के साथ आपकी एकमात्र समस्या वर्तमान शेल से बाहर निकल रही है, लेकिन यदि ऐसा है, तो एक सबस्क्रिप्शन काम कर सकता है।

username@host$ $(exit 42)
username@host$ echo $?
42

मैंने सिग्विन बैश पर अभी-अभी यह परीक्षण किया है और यह मेरे लिए काम करता है।

संपादित करें: क्षमा करें, मैंने इसे शेल संदर्भ के बाहर चलाने का हिस्सा याद किया। उस स्थिति में, यह .shलिपि के भीतर लिपटे बिना और आपके परिवेश से निष्पादित किए बिना मदद नहीं करेगा ।


4
$(exit 42)exit 42एक साधारण कमांड के आउटपुट को निष्पादित करने की कोशिश करता है जो थोड़ा सा समझ में आता है (यह भी काम नहीं करेगा yash)। (exit 42)( exitएक उपधारा में भी चलाते हैं , लेकिन इसका उत्पादन अकेले छोड़ देता है) अधिक समझ में आता है और अधिक पोर्टेबल होगा (यहां तक ​​कि csh या बॉर्न शेल भी)।
स्टीफन चेजलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.