我怎样才能否定一个过程的回报价值?

我正在寻找一个简单但跨平台的否定过程,否定过程返回的值。 它应该映射0到某个值!= 0和任何值!= 0到0,即以下命令应该返回“yes,nonexistingpath不存在”:

ls nonexistingpath | negate && echo "yes, nonexistingpath doesn't exist." 

那! – 运营商是伟大的,但不幸的是不独立于shell。

以前,答案是现在的第一部分作为最后一部分。

POSIX Shell包括一个! 操作者

为了解决其他问题,最近我(2015年9月)发现POSIX shell支持! 运营商。 例如,它被列为保留字 ,可以出现在stream水线的开始处 – 其中一个简单的命令是“pipe道”的特例。 因此,它可以在if语句中使用,也可以在while循环中使用,也可以在POSIX兼容的shell中使用。 因此,尽pipe我有所保留,但可能比我在2008年意识到的更广泛。POSIX 2004和SUS / POSIX 1997的快速检查表明! 出现在这两个版本。

便携式答案 – 与古董炮弹

在Bourne(Korn,POSIX,Bash)脚本中,我使用:

 if ...command and arguments... then : it succeeded else : it failed fi 

这是随机获得的。 “命令和参数”可以是pipe道或其他复合命令序列。

一个not命令

'!' 运算符,无论是内置于您的shell还是由o / s提供,都不是普遍可用的。 尽pipe写下来并不难,下面的代码至less可以追溯到1991年(尽pipe我认为我以前写过一个更早的版本)。 但是,我不倾向于在我的脚本中使用它,因为它不可靠。

 /* @(#)File: $RCSfile: not.c,v $ @(#)Version: $Revision: 4.2 $ @(#)Last changed: $Date: 2005/06/22 19:44:07 $ @(#)Purpose: Invert success/failure status of command @(#)Author: J Leffler @(#)Copyright: (C) JLSS 1991,1997,2005 */ #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include "stderr.h" #ifndef lint static const char sccs[] = "@(#)$Id: not.c,v 4.2 2005/06/22 19:44:07 jleffler Exp $"; #endif 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); } 

当它执行命令失败时,这将返回“成功”,与失败相反。 我们可以辩论,“做不成功”的select是否正确; 也许它应该报告一个错误,当它不被要求做任何事情。 "stderr.h"的代码提供了简单的错误报告function – 我到处使用它。 源代码的请求 – 见我的个人资料页面与我联系。

在Bash中,使用! 操作员在命令之前。 例如:

 ! ls nonexistingpath && echo "yes, nonexistingpath doesn't exist" 

你可以尝试:

 ls nonexistingpath || echo "yes, nonexistingpath doesn't exist." 

要不就:

 ! ls nonexistingpath 

如果不知何故,你没有Bash作为你的shell(例如:git脚本或puppet exectesting),你可以运行:

echo '! ls notexisting' | bash

– > retcode:0

echo '! ls /' | bash

– > retcode:1

 ! ls nonexistingpath && echo "yes, nonexistingpath doesn't exist." 

要么

 ls nonexistingpath || echo "yes, nonexistingpath doesn't exist."