ইউনিক্স কমান্ড যা সঙ্গে সঙ্গে একটি নির্দিষ্ট রিটার্ন কোড দেয়?


28

নীচে আমার উদাহরণের মতো কিছু করে এমন একটি মানক ইউনিক্স কমান্ড রয়েছে কি?

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

<cmd here>প্রক্রিয়াটি যখন প্রস্থান হয় তখন এমন কিছু হতে হবে যা কাঁটাচামচা ছাড়াই পারে এবং প্রস্থান কোড হিসাবে 56 টি ছেড়ে যায় leaves আমি exitএবং returnশেল বিল্টইনগুলি আমি যা খুঁজছি তার জন্য অনুপযুক্ত কারণ তারা আগমনকারী শেলটি এ থেকে বেরিয়ে এসে নিজেকে প্রভাবিত করে। <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আমি কেবল ভাবতে পারি তবে এটি আপনার শেলটি শেষ করে end bash -c 'exit 56'বা bash -c "exit $1"আপনার জন্য কাজ করতে পারে।
টিম কেনেডি

12
কীভাবে (exit 56)?
cuonglm

6
এটি সত্যিই একটি এক্সওয়াই প্রব্লেম মতো শোনাচ্ছে : এর চূড়ান্ত লক্ষ্য কী? আপনি যে আদেশটি দিয়েছিলেন তা কেন প্রস্থান কোড হিসাবে ফিরে আসে?
অলিভিয়ার ডুলাক

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>এটি একটি কার্যকর () - সক্ষম জিনিস require
ক্রিস

2
@ ক্রিস: যে কোনও শেল কমান্ডের জন্য আপনি এটিকে রূপান্তর করে এটি সম্পাদন করতে সক্ষম করতে পারেন/bin/sh -c ...originalcommand...
psmears

3
আমি হালকা হতাশ যে? = 56 কাজ করে না।
জোশুয়া

@ জোশুয়া: হতে পারে? তবে তারপরে এই প্রভাবটি সফল হয়েছিল, এবং আপনার কাছে $? 0 ...;) তে সেট করুন
অলিভিয়ার ডুলাক

@ অলিভারডুলাক: এটি হয় না। এটি একটি বিশ্লেষণ ত্রুটি আউট spits।
জোশুয়া

17

কেবলমাত্র একটি নির্দিষ্ট মান ফেরত দেওয়ার জন্য কোনও মানক UNIX কমান্ড নেই। গনুহ কোর Utilies প্রদান 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

আপনার যদি কোনও অতিরিক্ত সরঞ্জাম ইনস্টল না করে সর্বত্র (যেখানে ব্যাশ পাওয়া যায়, তা) কাজ করার প্রয়োজন হয় তবে আপনার মন্তব্যগুলি হিসাবে @ টিম কেনেডি পরামর্শ হিসাবে সম্ভবত নিম্নলিখিত কমান্ডটি গ্রহণ করতে হবে:

bash -c 'exit 56'

নোট করুন যে প্রত্যাবর্তনের মানগুলির বৈধ পরিসীমা 0..255 সহ অন্তর্ভুক্ত


1
trueএবং falseইউনিক্সে (এবং এমনকি পসিক্স) পাশাপাশি রয়েছে, কেবল জিএনইউতে নয়।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস এটি উল্লেখ করার জন্য ধন্যবাদ। ওপি যেমন বাশের উল্লেখ করেছে, আমি কোনওভাবে জিএনইউ ধরেছি - যদিও প্রশ্নটি নিজেই 'ইউনিক্স' বলেছিল।
tmh

14

আপনার যদি প্রস্থান স্থিতি প্রয়োজন হয় একটি নির্বাহিত আদেশ দ্বারা সেট করা। 1 এর জন্য কোনও ডেডিকেটেড কমান্ড নেই , তবে আপনি যেকোন ভাষার দোভাষী ব্যবহার করতে পারেন যা স্বেচ্ছাসেবী প্রস্থান স্থিতির সাথে প্রস্থান করার ক্ষমতা রাখে। shসর্বাধিক সুস্পষ্ট:

sh -c 'exit 56'

বেশিরভাগ shবাস্তবায়নের সাথে, এটি 0 থেকে 255 পর্যন্ত প্রস্থান কোডের মধ্যে সীমাবদ্ধ ( shবৃহত্তর মান গ্রহণ করবে তবে এটি কেটে ফেলতে পারে বা এমনকি sh257 থেকে 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 বিটে ছাড়ে না)।

নেটবিএসডি দিয়ে 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) একটি affirmer হিসেবে নিজেকে নামকরণ ছাড়া CC0 লাইসেন্স আবেদন সম্ভবত একটি ভাল ধারণা নয়, এবং আপনি এটি করতে হবে: একটি আধা-সংশ্লিষ্ট নোট অন ভালো , আপনি এখন 2) প্রোগ্রাম এই ছোট খুব তুচ্ছ আপনার কপিরাইট ব্যাপার জন্য লাইসেন্স ছাড়তে পারে।
রাইময়েড

2
(1) আপনি কেন এর argv[argc-1]পরিবর্তে ব্যবহার করছেন argv[1]এবং কেন অভিযোগ করছেন না তা আমি বুঝতে পারি না argc>2। (২) আমি argv[1]পরীক্ষার আগে পরীক্ষার দিকে argv[0]ঝুঁকে পড়তাম, ব্যবহারকারীকে তার পরিবর্তে true 56বা false 56তার পরিবর্তে বলার অনুমতি দিয়েছিলাম returncode 56argv[0]কোনও শব্দ হলে আপনি কোনও বার্তা দেন না এবং argc>0- এটি বিভ্রান্তিকর হতে পারে। (3) আমি ব্যবহারকারী-বন্ধুত্বের প্রতি আচ্ছন্ন, তাই আমি এর strcasecmpপরিবর্তে ব্যবহার করব strcmp। (4) আমি প্যারামিটারগুলি যাচাই করার প্রবণতা রাখি, এবং atoiএটির সত্যতা যাচাই না করে এর মান মান ব্যবহার করি না। এটির মতো 2 ¢ প্রোগ্রামের জন্য, আমি অনুমান করি এটি কোনও বিষয় নয়।
জি-ম্যান

@ জি-ম্যান আমরাও trueকিংবা falseলিনাক্স অপারেটিং সিস্টেমে কোনো আর্গুমেন্ট প্রক্রিয়া
ThePiercingPrince

ঠিক আছে, এটি সঠিক - এগুলি সহ কোনও যুক্তি প্রক্রিয়া করে না argv[0]; প্রোগ্রামগুলি /bin/trueএবং /bin/falseহার্ড-কোডেড বহির্গমন কোড সহ পৃথক এক্সিকিউটেবল। আপনি একটি প্রোগ্রাম লিখেছেন যা উভয় true এবং false(সংযুক্ত) হিসাবে ইনস্টল করা যেতে পারে , যা চালাক। তবে প্রশ্নটি ব্যবহারকারী-নির্দিষ্ট প্রস্থান স্থিতি পেতে কীভাবে জিজ্ঞাসা করে। আপনার প্রোগ্রামটি সেই প্রশ্নের উত্তর দেয়, তবে কেবলমাত্র এটি অন্য কোনও ফাইলের নামে ইনস্টল করা থাকলে। যতক্ষণ আপনি argvযাই হোক না কেন ততক্ষণ ততক্ষণ আমার বিশ্বাস, তৃতীয় লিঙ্কের প্রয়োজনীয়তা এড়িয়ে চতুরতার মাত্রা বজায় রাখার পরামর্শ দেওয়ার মতো এটি করা।
জি-ম্যান 21

0

exitকমান্ডটি নিয়ে যদি আপনার কেবল সমস্যাটি বর্তমান শেলটি থেকে বেরিয়ে আসে তবে আমি ঠিক নিশ্চিত নই , তবে যদি তা হয় তবে একটি সাবশেল কাজ করতে পারে।

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

আমি এখনই সাইগউইন বাশে এটি পরীক্ষা করেছি এবং এটি আমার পক্ষে কাজ করে।

সম্পাদনা: দুঃখিত, আমি এটি শেল প্রসঙ্গে বাইরে চালনার অংশটি মিস করেছি। সেক্ষেত্রে এই .shলিপিটি কোনও স্ক্রিপ্টের মধ্যে আবৃত না করে এবং এটি আপনার পরিবেশ থেকে কার্যকর করা ছাড়া কোনও সাহায্য করবে না ।


4
$(exit 42)আউটপুটটিকে exit 42একটি সাধারণ কমান্ড হিসাবে চালিত করার চেষ্টা করে যা কিছুটা বুদ্ধিমান হয় (এটি এর সাথে কাজ করে না yash)। (exit 42)(এছাড়াও exitএকটি সাবশেলে চালানো , তবে এটির আউটপুটটি একা ফেলে দেয়) আরও বেশি অর্থবোধ তৈরি করবে এবং আরও বহনযোগ্য হবে (এমনকি সিএসএস বা বোর্ন শেল পর্যন্ত)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.