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
যা কয়েকটি অন্যান্য শেলও বুঝতে পারে))
sleep 1 && echo $?
স্লিপার সেলটির কোডটি কেবল শূন্য হলেই মুদ্রণ করতে পারে ...