টাইম কমান্ডের অনুরূপ কমান্ডের বহির্গমন কোড লগ করুন


10

ব্যবহার

time sleep 1

উৎপাদনের:

$ time sleep 1

real    0m1.005s
user    0m0.001s
sys     0m0.001s

আমি কি কোন কমান্ড ব্যবহার করে প্রস্থান করতে প্রস্থান করতে ব্যবহার করতে পারি sleepবা আমি যে কমান্ডটি চালাতে চাইছি?

কিছু পছন্দ:

$ log-exit-code sleep 1

সম্ভবত এই যথেষ্ট?

sleep 1 && echo "$?"

3
না, sleep 1 && echo $?স্লিপার সেলটির কোডটি কেবল শূন্য হলেই মুদ্রণ করতে পারে ...
সাট কাটসুরা

ওহ হ্যাঁ আপনি ঠিক বলেছেন
আলেকজান্ডার মিলস

1
sleep 1 && echo "$?" || echo "$?"
jesse_b

2
আমি এখনও অন্য সমস্ত হিসাবে একটি উত্তর যুক্ত করেছি যে মূল রিটার্ন মানটি বাতিল করে দেয়, যা ইমো খারাপ (এই উত্তরগুলির পরে, $? সর্বদা 0 হয় কারণ তারা সর্বশেষে কাজ করে তা সর্বদা কার্যকর হয় They তারা সকলেই রাখতে ভুলে গিয়েছিল আসল রিটার্ন মান, এবং এটি প্রদর্শন করার পরে এটি ফিরিয়ে দিন Therefore সুতরাং তারা কেবল এটি একটি পর্যবেক্ষকের কাছে দেখায়, তবে স্ক্রিপ্টের বাকী অংশের জন্য এটি 'আড়াল' করে রাখে, যে গুরুত্বপূর্ণ কমান্ডটি ফিরে আসে কিনা তা দেখতে এখন "$?" ব্যবহার করতে পারে না 0 বা অন্য কিছু ...)
অলিভিয়ার দুলাক

1
এছাড়াও নীচের সমস্ত সমাধান সহজেই এই কার্যকারিতা কার্যকর করতে পারে। উদাহরণস্বরূপ কুসালানন্দের উদাহরণটি EXIT_CODE=$(tellexit command)
হ'ল

উত্তর:


4

আমার পরীক্ষায় এখন পর্যন্ত এটি কাজ করেছে:

command && echo "$?" || echo "$?"

এটি সফল হলে বা এটি ব্যর্থ হলে এটি প্রস্থান কোডটি প্রতিধ্বনিত করতে বলে।

সাতোর নীচে যেভাবে উল্লেখ করা হয়েছে এটি মূলত:

command; echo "$?"

একটি জিনিস যা / এবং আদেশকে সার্থক করে তুলতে পারে তা হ'ল:

command && echo "Success! Exit Code: $?" || echo "Failure! Exit Code: $?"

অলিভিয়ারের উদ্বেগ হিসাবে যদি আপনার প্রস্থানের কোডটি প্রস্থান করার জন্য আপনার স্ক্রিপ্টের প্রয়োজন হয় তবে এটি একটি নন ইস্যু। আপনার স্ক্রিপ্টটি এর মতো দেখতে পারে:

command
case "$?" in; 
    0) echo "Command exited with: 0"
       <command if good>
       ;;
    1) echo "Command exited with: 1"
        <command if bad>
        ;;
    255) echo "Command exited with: 255"  # for ssh maybe?
         <command if 255>
         ;;
    *) echo "Command exited with: >2"
        <command for other exit code>
        ;;
esac

13
এর, ঠিক কীভাবে ভাল command; echo $??
স্যাটাস কাতসুরা

4
আমি অনুমান করি যে এটি তা নয়। command; echo $?এটি একটি আরও ভাল উত্তর।
jesse_b

ওহহহহহহহহহহق الصريحটি মনে হয় এটি সর্বোত্তম বিকল্প, সুতরাং আমি এটিকে উত্তর হিসাবে বেছে নিয়েছি, যদি কেউ একমত না হন, এলএমকে
আলেকজান্ডার মিলস

@ আলেকজান্ডারমিলস কেবল আপনিই জানেন যে আপনার প্রশ্নের সবচেয়ে উপযুক্ত উত্তরটি
কোনটি

1
আমি এটি অপছন্দ করি: এটি প্রস্থান কোডটি পরে পরিবর্তন করে command ; echo $?কারণ echo $?সর্বদা সফল হয় এবং তাই এর পরে, value এর নতুন মান? আসল রিটার্ন কোডটি প্রদর্শন করার পরেও রাখার একটি উপায় রয়েছে, যদি এই আসল রিটার্ন কোডটি পরে কার্যকর হয় (উদাহরণস্বরূপ: কোনও স্ক্রিপ্টে, কীভাবে চালিয়ে যাবেন সিদ্ধান্ত নেওয়ার আগে রিটার্ন কোডটি পরীক্ষা করা গুরুত্বপূর্ণ)। বেশ কয়েকটি সমাধানের জন্য আমার উত্তর দেখুন (এখানে বেশিরভাগ উত্তর একই পদ্ধতিতে পরিবর্তন করা যেতে পারে)
অলিভিয়ার ডুলাক

11

cmd && echo "$?"এটি কাজ করবে না কারণ এটি প্রয়োজন অনুসারে কেবল জিরো মুদ্রণ echoকরবে ( পূর্ববর্তী কমান্ডটি সফলভাবে সম্পন্ন করার পরে কেবলমাত্র এটি কার্যকর করা হবে)।

আপনার জন্য এখানে একটি ছোট শেল ফাংশন:

tellexit () {
    "$@"

    local err="$?"
    printf 'exit code\t%d\n' "$err" >/dev/tty
    return "$err"
}

এটি প্রদত্ত কমান্ডের প্রস্থান কোডটি একইভাবে timeকমান্ডের মতো মুদ্রণ করে।

$ tellexit echo "hello world"
hello world
exit code       0

$ tellexit false
exit code       1

পুনঃনির্দেশিত দ্বারা printfকরা /dev/ttyফাংশনে, আমরা এখনও ব্যবহার করতে পারেন tellexitআমাদের মান আউটপুট বা এরর স্ট্রীমে আবর্জনা পাচ্ছেন না পুনঃনির্দেশগুলি সঙ্গে

$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code       0
$ cat out
hello
$ cat err
world

ভেরিয়েবলে প্রস্থান কোড সংরক্ষণ করে আমরা এটিকে কলারে ফেরত দিতে সক্ষম হয়েছি:

$ tellexit false || echo 'failed'
exit code       1
failed

একই ফাংশনের একটি ফ্যানসিয়ার সংস্করণ প্রস্থান কোডটি 128 এর বেশি হলে (যার অর্থ এটি সংকেতের কারণে শেষ হয়ে গেছে) কম্যান্ডটি মেরেছিল এমন সংকেতও মুদ্রণ করে:

tellexit () {
    "$@"

    local err="$?"

    if [ "$err" -gt 128 ]; then
        printf 'exit code\t%d (%s)\n' "$err" "$(kill -l "$err")" >/dev/tty
    else
        printf 'exit code\t%d\n' "$err" >/dev/tty
    fi

    return "$err"
}

পরীক্ষামূলক:

$ tellexit sh -c 'kill $$'
exit code       143 (TERM)

$ tellexit sh -c 'kill -9 $$'
Killed
exit code       137 (KILL)

( localজিনিসটির প্রয়োজন ash/ pdksh/ bash/ zsh, বা আপনি এটি পরিবর্তন করতে পারেন typesetযা কয়েকটি অন্যান্য শেলও বুঝতে পারে))


শীতল, আপনি কীভাবে টেলেক্সিট ব্যবহার করবেন, এটি অ্যাকশন প্লাসে দেখান
আলেকজান্ডার মিলস

1
অ্যালেক্সান্ডারমিলস আপডেট দেখুন।
কুসালানন্দ

2
এটির মূল রিটার্ন মান রাখা উচিত এবং শেষ পর্যন্ত ফিরে আসা উচিত।
অলিভিয়ার ডুলাক

অলিভিয়ারডুলাক সত্যই ভাল পর্যবেক্ষণ! আমি সংশোধন করব।
Kusalananda

7

একটি শেল র‍্যাপার ফাংশন জিনিসযুক্ত ব্যবহার করুন। সম্ভবত অন্য একটি নাম দিয়ে।

$ exito() { "$@"; echo $?; }
$ exito true
0
$ exito false
1
$ exito echo "test test"      
test test
0
$ 

(এটি অবশ্যই স্ট্যান্ডার্ড আউটপুটকে দূষিত করবে, সুতরাং tty@ কুসালানান্দার প্রদর্শিত হিসাবে ব্যবহার করুন বা ইন্টারেক্টিভ প্রসঙ্গে এটি ব্যবহার করবেন না))

অপরিশোধনযোগ্য অঞ্চলে ঘুরে বেড়ানো, কয়েকটি শেল একটি পাইপলাইনে সমস্ত কমান্ডের স্থিতি সম্পর্কে রিপোর্ট করতে পারে, কেবল শেষটি নয়, যেমন জেডএসএইচে আপনি যদি একটি সম্পূর্ণ পাইপলাইন থেকে ব্যর্থতা রিপোর্ট করতে চান:

% TRAPZERR() { print >/dev/tty $pipestatus }
% perl -e 'exit 42' | perl -e 'exit 99'
42 99
% false | perl -e 'exit 42' | perl -e 'exit 99'
1 42 99
% perl -e 'exit 42' | perl -e 'exit 99' | true
% 

TRAPZERR অন্যথায় কোনও ত্রুটি না থাকলে গুলি চালায় না ("কোনও সংবাদ সুসংবাদ নয়" প্রধান)।


1
এটির মূল রিটার্ন মান রাখা উচিত এবং শেষ পর্যন্ত ফিরে আসা উচিত। একটি সহজ জিনিস প্রদর্শন (প্রিন্টফ, প্রতিধ্বনি) ('-' ইত্যাদি দিয়ে শুরু হয় না) সর্বদা কাজ করে এবং তার পরে "$"? " ডিসপ্লেতে কাজ করার সাথে সাথে এখন "0" এর মান রয়েছে
অলিভিয়ার ডুলাক

7

জিএনইউতে timeএর জন্য একটি বিকল্প রয়েছে:

time -f %x sleep 1
0

প্রস্থান কোড 1 এর মধ্য দিয়ে যায় , যদি না একটি সংকেত 2 :

$ /usr/bin/time -f %x sleep 1; echo $?
0
0

$ /usr/bin/time -f %x sleep 2x; echo $?
sleep: invalid time interval ‘2x’
Try 'sleep --help' for more information.
1
1

$ /usr/bin/time -f %x sleep 60s; echo $? # Press ^C before a minute elapses
0
2

আপনি যদি সিগন্যাল কিল পরিস্থিতি জানতে / পরিচালনা করতে চান -vতবে স্ট্রার্ডটির স্ট্রার্ডটি পাস করুন এবং গ্রেপ করুন Command terminated by signal


1 অলিভিয়ার ডুলাককে প্রস্থান কোডটি পেরিয়ে যাওয়ার জন্য ধন্যবাদ।
2 এছাড়াও, ক্যাট সিগন্যাল প্রস্থান কোডটি পাস না করার জন্য আপনাকে স্ট্যাফেন চ্যাজেলাস ধন্যবাদ জানায়।


1
Interresting। জিএনইউ কেবলমাত্র বিরতিহীন, যেহেতু এটি বাকী কোড অনুসরণ করার জন্য (সম্ভবত) মূল রিটার্ন কোডটি রাখবে (যেমন, এটি অন্যান্য উত্তরগুলির মতো "0" দিয়ে প্রতিস্থাপন করে না)
অলিভিয়ার ডুলাক

2
0কমান্ড হত্যা করা হলেও এটি ফিরে আসে ।
স্টাফেন চেজেলাস

2
@ বিশপ, আমি সম্মত 0 টি ক্ষেত্রে আদর্শের চেয়ে কম। তবে মনে রাখবেন যে, কমান্ড যখন সিগন্যালের মাধ্যমে মারা যায় তখন কী প্রতিবেদন করা যায় সে সম্পর্কে কোনও সাধারণ চুক্তি নেই। রিটার্নিং 128 + সংকেত নম্বরটি কয়েকটি শেল ব্যবহার করে। আপনি এমন কিছুর মতো 256+signumবা 384+signumএমনকি signum/256বা signum/256+0.5কোনও কোর উত্পন্ন হওয়ার পরেও দেখতে পান (আসলে স্ট্যাটাসটি waitpid()256 দ্বারা বিভক্ত হয়ে ফিরে এসেছে )। কিছু একটি পাঠ্য উপস্থাপনা (মত sigintবা sigquit+core) দিতে হবে । এখনও আমি সম্ভবত gnu.coreutils.bugs নিউজ গ্রুপে আলোচনা করার মতো মূল্যবান।
স্টাফেন চেজেলাস

3
(আসলে এর timeঅংশ নয় coreutils, এটি নিজস্ব বাগ মেলিং তালিকার সাথে একটি প্যাকেজ নিজেই রয়েছে (বাগ-টাইম@gnu.org))
স্টাফেন চাজেলাস

1
@ বিশপ, system()এখনও ব্রায়ান কর্নিগান ( kইন awk) বা nawkসোলারিস, awkফ্রিবিএসডি-র যেটি থেকে প্রাপ্ত তা রক্ষণাবেক্ষণের মতো traditionalতিহ্যবাহী অবাস্তবতার । কোর ডাম্পের আকার সীমাবদ্ধ না হলে awk 'BEGIN{print system("kill -s ABRT $$")}'ফলাফলগুলি 0.523438। এর আচরণের gawkপরিবর্তন হয়েছে সম্প্রতি --traditionalবা তার সাথে বিভিন্ন আচরণের সাথে --posix( close(cmd)আরও ভিন্নতার জন্য তার মূল্যের
মানটিও

2

আমি অন্যান্য সমস্ত উত্তর অপছন্দ করি (যদিও তাদের চতুরতার জন্য আমি অনেক পছন্দ করি): তারা প্রস্থান কোড প্রদর্শন করে তবে তারা এটি পরিবর্তন করে। (প্রদর্শিত অংশটি সত্য, সুতরাং এটির পরে রিটার্ন কোডটি 0)

এখানে একটি পরিবর্তিত সংস্করণ:

do_and_tell () {
   "$@"
   returncode="$?"
   printf "Execution of : \n%s\n yelded a return code of: \n%s\n" "$*" "$returncode"
   return $returncode  # the interresting addition... keeps the commands return value.
}

## usage:

prompt$ do_and_tell true
Execution of : 
true
 yelded a return code of: 
0

prompt$ echo $?
0

prompt$ do_and_tell false
Execution of : 
false
 yelded a return code of: 
1

prompt$ echo $?
1

আসলে, @ বিশপের উত্তরটি হ'ল এই মানটি রাখে তবে এটি জিএনইউর সংস্করণে নির্ভর করে timeযার সর্বদা উপলভ্য নয়।
অলিভিয়ার ডুলাক

2

কিছুটা দৃust় হতে, প্রস্থান স্থিতিটি আলাদা এফডিতে প্রেরণ করুন যাতে এটি স্টাডাউট / স্টডারর থেকে স্বাধীনভাবে পরিচালনা করা যায়:

exit_status() {
    "$@"
    rv=$?
    echo >&3 "$rv"
    return "$rv"
}

# exit status and stdout to stdout:
> exit_status echo "hello" 3>&1
hello
0

# exit_status to stdout, stdout to /dev/null
> exit_status echo "hello" 3>&1 1>/dev/null
0
> exit_status ehco "hello" 3>&1 1>/dev/null
ehco: command not found
127

# exit_status to stdout, stdout and stderr to /dev/null
> exit_status ehco "hello" 3>&1 &>/dev/null
127

নোট করুন আপনার এফডি 3 দিয়ে কিছু করা দরকার বা এটি বলবে Bad file descriptor

এই প্রোগ্রামগুলি অন্য প্রোগ্রামের একাধিক এফডি শুনে অন্য প্রোগ্রামের ইনপুটগুলিতে এই আউটপুটগুলি সরবরাহ করতে আরও কনফিগার করা যেতে পারে; আপনি এটি 90 এর কিবানা শুরুর দিক হিসাবে ব্যবহার করতে পারেন :)


এটির মূল রিটার্ন মান রাখা উচিত এবং শেষ পর্যন্ত ফিরে আসা উচিত। একটি সহজ জিনিস প্রদর্শন (প্রিন্টফ, প্রতিধ্বনি) ('-' ইত্যাদি দিয়ে শুরু হয় না) সর্বদা কাজ করে এবং তার পরে "$"? " ডিসপ্লেতে কাজ করার সাথে সাথে এখন "0" এর মান রয়েছে
অলিভিয়ার ডুলাক

1

যখন অন্য সমস্ত (খুব আকর্ষণীয়) উত্তরগুলি ওপি কর্তৃক ঠিক জিজ্ঞাসা করা ঠিক প্রশ্নটি সম্বোধন করে, বাস্তবে বিষয়গুলি সাধারণত সহজ হয়। আপনি কেবল প্রস্থান স্থিতিটি কোনও ভেরিয়েবলের সাথে সংরক্ষণ করুন (অবিলম্বে কমান্ডটি অনুসরণ করে) এবং আপনি যেভাবে চান তা লগ বা লগ করুন log যেমন / dev / stderr এ মুদ্রণ করুন বা একটি লগ ফাইলে একটি পাঠ্য বার্তা হিসাবে এটি লিখুন / যুক্ত করুন। এবং এটি পরবর্তী কোডে সিদ্ধান্ত গ্রহণ / প্রবাহ নিয়ন্ত্রণে ব্যবহারের জন্যও সংরক্ষিত রয়েছে।

যদি এটি কোনও কার্যক্রমে থাকে:

function some-function () {
    local rc ## to avoid side effects
    ...
    some-command ## run any command
    rc=$?  ## save the return status in a variable
    echo "some-command returned $rc" ## optionally tell the user about it
    ...
    return $rc  ## at the end, if appropriate
}

যদি এটি সরাসরি স্ক্রিপ্টে থাকে:

some-command ## run any command
rc=$?  ## save the return status in a variable
echo "some-command returned $rc" ## optionally tell the user about it
...
exit $rc    ## at the end to tell any calling script about it, if appropriate

(ডকিং এবং কভারিং কারণ এটি সঠিক প্রশ্নের উত্তর দেয় না ))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.