পূর্বে, উত্তরটি এখন প্রথম বিভাগ হিসাবে শেষ বিভাগ হিসাবে উপস্থিত ছিল।
পসিক্স শেলটিতে একটি !
অপারেটর অন্তর্ভুক্ত
অন্যান্য সমস্যার জন্য শেল স্পেসিফিকেশনটির আশেপাশে কব্জি করা, আমি সম্প্রতি (সেপ্টেম্বর 2015) লক্ষ্য করেছি যে পসিক্স শেল একটি !
অপারেটরকে সমর্থন করে । উদাহরণস্বরূপ, এটি একটি সংরক্ষিত শব্দ হিসাবে তালিকাভুক্ত এবং পাইপলাইনের শুরুতে উপস্থিত হতে পারে - যেখানে একটি সাধারণ কমান্ডটি 'পাইপলাইন' এর একটি বিশেষ কেস। এটি, সুতরাং, if
বিবৃতিতে এবং while
বা until
লুপগুলিতেও ব্যবহার করা যেতে পারে - পসিক্স-অনুবর্তী শেলগুলিতে। ফলস্বরূপ, আমার রিজার্ভেশন সত্ত্বেও, এটি সম্ভবত ২০০৮ সালে আমি যা বুঝতে পেরেছিলাম তার চেয়ে বেশি বিস্তৃতভাবে উপলভ্য। POSIX 2004 এবং SUS / POSIX 1997 এর একটি দ্রুত চেক দেখায় যা !
উভয় সংস্করণে উপস্থিত ছিল।
নোট করুন !
অপারেটরটি অবশ্যই পাইপলাইনের শুরুতে উপস্থিত হবে এবং পুরো পাইপলাইনের স্থিতি কোডটি (যেমন শেষ আদেশটি) উপেক্ষা করবে । এখানে কিছু উদাহরণঃ.
$ ! some-command succeed; echo $?
1
$ ! some-command fail | some-other-command fail; echo $?
0
$ ! some-command < succeed.txt; echo $?
1
$ ! RESULT=fail some-command; echo $?
0
$ if ! some-command < input.txt | grep Success > /dev/null; then echo 'Failure!'; recover-command; mv input.txt input-failed.txt; fi
Failure!
$ ls *.txt
input-failed.txt
বহনযোগ্য উত্তর - অ্যান্টিক শেলগুলির সাথে কাজ করে
বোর্নে (কর্ন, পসিক্স, ব্যাশ) স্ক্রিপ্টে আমি ব্যবহার করি:
if ...command and arguments...
then : it succeeded
else : it failed
fi
এটি যত তাড়াতাড়ি পোর্টেবল হয়। 'কমান্ড এবং আর্গুমেন্ট' কমান্ডের পাইপলাইন বা অন্যান্য যৌগিক ক্রম হতে পারে।
একটি not
আদেশ
দ্য '!' অপারেটর, আপনার শেলটিতে অন্তর্নির্মিত হোক বা o / s দ্বারা সরবরাহিত, সর্বজনীনভাবে উপলভ্য নয়। যদিও এটি লেখার জন্য ভয়ঙ্করভাবে কঠিন নয় - নীচের কোডটি কমপক্ষে ১৯৯১ সাল পর্যন্ত রয়েছে (যদিও আমি মনে করি আমি এর আগের সংস্করণটি আরও অনেক আগে লিখেছি)। যদিও আমি এটি আমার স্ক্রিপ্টগুলিতে ব্যবহার করি না, কারণ এটি নির্ভরযোগ্যভাবে উপলভ্য নয়।
/*
@(
@(
@(
@(
@(
@(
*/
static const char sccs[] = "@(#)$Id: not.c,v 4.2 2005/06/22 19:44:07 jleffler Exp $";
int main(int argc, char **argv)
{
int pid;
int corpse;
int status;
err_setarg0(argv[0]);
if (argc <= 1)
{
/* Nothing to execute. Nothing executed successfully. */
/* Inverted exit condition is non-zero */
exit(1);
}
if ((pid = fork()) < 0)
err_syserr("failed to fork\n");
if (pid == 0)
{
/* Child: execute command using PATH etc. */
execvp(argv[1], &argv[1]);
err_syserr("failed to execute command %s\n", argv[1]);
/* NOTREACHED */
}
/* Parent */
while ((corpse = wait(&status)) > 0)
{
if (corpse == pid)
{
/* Status contains exit status of child. */
/* If exit status of child is zero, it succeeded, and we should
exit with a non-zero status */
/* If exit status of child is non-zero, if failed and we should
exit with zero status */
exit(status == 0);
/* NOTREACHED */
}
}
/* Failed to receive notification of child's death -- assume it failed */
return (0);
}
কমান্ডটি কার্যকর করতে ব্যর্থ হলে এটি ব্যর্থতার বিপরীতে 'সাফল্য' দেয়। 'সাফল্যের সাথে কিছুই করবেন না' বিকল্পটি সঠিক ছিল কিনা তা নিয়ে আমরা বিতর্ক করতে পারি; যখন এটি কিছু করার জন্য বলা না হয় তখন এটি একটি ত্রুটির প্রতিবেদন করা উচিত। ' "stderr.h"
' এ কোডটি সাধারণ ত্রুটির প্রতিবেদন করার সুবিধা সরবরাহ করে - আমি এটি সর্বত্র ব্যবহার করি। অনুরোধে উত্স কোড - আমার সাথে যোগাযোগ করতে আমার প্রোফাইল পৃষ্ঠা দেখুন।