पहले, उत्तर को अंतिम अनुभाग के रूप में अब पहले खंड के साथ प्रस्तुत किया गया था।
POSIX Shell में एक !
ऑपरेटर शामिल होता है
अन्य मुद्दों के लिए शेल विनिर्देश के आसपास, मैंने हाल ही में (सितंबर 2015) देखा कि POSIX शेल एक !
ऑपरेटर का समर्थन करता है । उदाहरण के लिए, इसे एक आरक्षित शब्द के रूप में सूचीबद्ध किया गया है और एक पाइपलाइन की शुरुआत में दिखाई दे सकता है - जहां एक साधारण कमांड 'पाइपलाइन' का एक विशेष मामला है। इसलिए यह प्रयोग किया जा सकता if
बयानों और while
या until
POSIX अनुरूप गोले में - बहुत छोरों। नतीजतन, मेरे आरक्षण के बावजूद, यह संभवत: 2008 में वापस महसूस किए जाने की तुलना में अधिक व्यापक रूप से उपलब्ध है। पोसिक्स 2004 और एसयूएस / पोसिक्स 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
आज्ञा
'!' ऑपरेटर, चाहे आपके शेल में अंतर्निहित हो या ओ / एस द्वारा प्रदान किया गया हो, सार्वभौमिक रूप से उपलब्ध नहीं है। यह लिखना बहुत कठिन नहीं है, हालांकि - नीचे दिए गए कोड कम से कम 1991 तक हैं (हालांकि मुझे लगता है कि मैंने पिछले संस्करण को और भी लंबा लिखा है)। मैं अपनी स्क्रिप्ट में इसका उपयोग नहीं करता, हालाँकि, क्योंकि यह मज़बूती से उपलब्ध नहीं है।
/*
@(
@(
@(
@(
@(
@(
*/
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"
' में कोड सरल त्रुटि रिपोर्टिंग सुविधाएं प्रदान करता है - मैं इसका हर जगह उपयोग करता हूं। अनुरोध पर स्रोत कोड - मुझसे संपर्क करने के लिए मेरा प्रोफाइल पेज देखें।