shell - shell 如何使进程的返回值无效?

  显示原文与译文双语对照的内容
86 2

我正在寻找一个简单但跨平台的平台否定 -process that一个进程返回的值。 应将 0映射到某些值!= 0和任何值!= 0到 0,换句话说,将返回"。是,nonexistingpath不存在":


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



- 操作符很好,但不幸的不是外壳。

时间: 原作者:

105 5

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

POSIX shell 包含 运算符!

针对其他问题,我发现 shell 支持一个 操作符。! 例如它作为一个保留字,可以出现在管道的开头,其中一个简单的命令是'管道'的特例。 因此,它可以在 if 语句中使用,也可以在posix兼容的外壳中使用 while 或者 until 循环。 因此,尽管我的预订,它可能比我在 2008中实现的更广泛。 对 POSIX 2004和 in/POSIX 1997的快速检查显示 在这两个版本中都存在。!

注意, 操作符必须出现在管道的开始并且对整个管道的状态代码求反( 例如 ) 。! 的最后一个命令) 。 采样。


# Simple commands, pipes, and redirects work fine.


$! some-command succeed; echo $?


1


$! some-command fail | some-other-command fail; echo $?


0


$! some-command <succeed.txt; echo $?


1



# Environment variables also work, but must come after the!.


$! RESULT=fail some-command; echo $?


0



# A more complex example.


$ 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



便携式应答—适用于古董外壳

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


if.. .command and arguments...


then : it succeeded


else : it failed


fi



这可以可移植。 '命令和参数'可以是管道或者其他复合命令序列。

not 命令

无论是内置到 shell 还是由 O/S 提供的''运算符,都不是普遍可用的。 不是很难写,但是下面的代码至少返回至少 1991个( 尽管我想我以前写了更多的版本) 。 但是,我不倾向于在脚本中使用它,因为它不可靠。


/*


@(#)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 forkn");



 if (pid == 0)


 {


/* Child: execute command using PATH etc. */


 execvp(argv[1], &argv[1]);


 err_syserr("failed to execute command %sn", 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"'中的代码提供了简单的错误报告工具- 我到处使用它。 请求的源代码- 请参见我的个人资料页以联系我。

原作者:
52 4

在Bash中,在命令之前使用运算符。 举个例子:


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



原作者:
110 4

你可以试试:


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



或者只是:


! ls nonexistingpath



原作者:
78 1

如果你没有将Bash作为你的shell ( 例如: git脚本或者 Puppet exec测试) 你可以运行:

echo '! ls notexisting' | bash

-> retcode: 0

echo '! ls/' | bash

-> retcode: 1

52 0

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



或者


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



原作者:
...