简单版本

1. 创建一个脚本a,内容如下:

#!/bin/sh
      #filename: a
      exit 22

2. 创建一个c语言程序1.C,调用该脚本,通过system的返回值来判断是否执行脚本成功.

#include <stdio.h>
       #include <stdlib.h>
       #include <iostream.h>
       int main()
      {
            int nRes = system("a");
            nRes = nRes >> 8;
            cout<<nRes<<endl;
           return 1;
      }

通过: g++ -o test 1.C得到可执行文件:test.

执行:./text后得到的结果就是: 22.

3. 修改脚本a,在a中实现文件拷贝的功能,如果拷贝不成功,则出现一个自定义的提示.

#!/bin/sh
       #filename: a
       if cp 1.C 2.C > /dev/null 2>
       then
           echo "cp succeed !";
       else  
           echo "`basename $0`: cp not succeed !";
       fi

执行text,得到的结果为:
   cp succeed !
   0
 
   如果要拷贝的文件为3.C,该文件是一个不存在的文件,如下所示:

#!/bin/sh
       #filename: a
       if cp 3.C 2.C > /dev/null 2>
       then
           echo "cp succeed !";
       else  
           echo "`basename $0`: cp not succeed !";
           exit 1;
       fi

那么执行./test后得到的结果就是:
  a: cp not succeed !
  1

通过上面的操作我们知道了if在测试返回值的时候: 0表示真;1表示假.

复杂版本
例:

status = system("./test.sh");

1、先统一两个说法:
(1)system返回值:指调用system函数后的返回值,比如上例中status为system返回值
(2)shell返回值:指system所调用的shell命令的返回值,比如上例中,test.sh中返回的值为shell返回值。
 
2、如何正确判断test.sh是否正确执行?
仅判断status是否==0?或者仅判断status是否!=-1?
 
都错!
 
3、man中对于system的说明
 
RETURN VALUE
       The value returned is -1 on error (e.g.  fork() failed), and the return
       status  of  the command otherwise.  This latter return status is in the
       format specified in wait(2).  Thus, the exit code of the  command  will
       be  WEXITSTATUS(status).   In  case  /bin/sh could not be executed, the
       exit status will be that of a command that does exit(127).
看得很晕吧?
 
system函数对返回值的处理,涉及3个阶段:
阶段1:创建子进程等准备工作。如果失败,返回-1。
阶段2:调用/bin/sh拉起shell脚本,如果拉起失败或者shell未正常执行结束(参见备注1),原因值被写入到status的低8~15比特位中。system的man中只说明了会写了127这个值,但实测发现还会写126等值。
阶段3:如果shell脚本正常执行结束,将shell返回值填到status的低8~15比特位中。
备注1:
只要能够调用到/bin/sh,并且执行shell过程中没有被其他信号异常中断,都算正常结束。
比如:不管shell脚本中返回什么原因值,是0还是非0,都算正常执行结束。即使shell脚本不存在或没有执行权限,也都算正常执行结束。
如果shell脚本执行过程中被强制kill掉等情况则算异常结束。
 
如何判断阶段2中,shell脚本是否正常执行结束呢?系统提供了宏:WIFEXITED(status)。如果WIFEXITED(status)为真,则说明正常结束。
如何取得阶段3中的shell返回值?你可以直接通过右移8bit来实现,但安全的做法是使用系统提供的宏:WEXITSTATUS(status)。
 
 
由于我们一般在shell脚本中会通过返回值判断本脚本是否正常执行,如果成功返回0,失败返回正数。
所以综上,判断一个system函数调用shell脚本是否正常结束的方法应该是如下3个条件同时成立:
(1)-1 != status
(2)WIFEXITED(status)为真
(3)0 == WEXITSTATUS(status)
 
注意:
根据以上分析,当shell脚本不存在、没有执行权限等场景下时,以上前2个条件仍会成立,此时WEXITSTATUS(status)为127,126等数值。
所以,我们在shell脚本中不能将127,126等数值定义为返回值,否则无法区分中是shell的返回值,还是调用shell脚本异常的原因值。shell脚本中的返回值最好多1开始递增。
 
判断shell脚本正常执行结束的健全代码如下:
?
#include <stdio.h>  
#include <stdlib.h>  
#include <sys/wait.h>  
#include <sys/types.h>  
   
int main()
{
    pid_t status;
   
   
    status = system("./test.sh");
   
    if (-1 == status)
    {
        printf("system error!");
    }
    else
    {
        printf("exit status value = [0x%x]\n", status);
   
        if (WIFEXITED(status))
        {
            if (0 == WEXITSTATUS(status))
            {
                printf("run shell script successfully.\n");
            }
            else
            {
                printf("run shell script fail, script exit code: %d\n", WEXITSTATUS(status));
            }
        }
        else
        {
            printf("exit status = [%d]\n", WEXITSTATUS(status));
        }
    }
   
    return 0;
}

  
 
WIFEXITED(stat_val) Evaluates to a non-zero value if status
was returned for a child process that
terminated normally.

WEXITSTATUS(stat_val) If the value of WIFEXITED(stat_val) is
non-zero, this macro evaluates to the
low-order 8 bits of the status argument
that the child process passed to _exit()
or exit(), or the value the child
process returned from main().

转载于:https://www.cnblogs.com/zhangzhang/archive/2013/02/21/2920583.html

linux 脚本返回值相关推荐

  1. PHP允许输入负数,php exec在linux中返回值不能为负数

    php exec在linux中返回值不能为负数有需要的朋友可参考一下. 我们先来了解一下关于exec函数的使用方法 exec() 原型:  代码如下 复制代码 string exec (string ...

  2. Linux 命令返回值

    在Linux中不管是启动桌面程序还是在控制台执行命令都会有一个返回值,可以叫做错误号(perror),在linux中执行命令后可通过命令:echo $?来查看上一条命令的返回值.要查看返回值的具体含义 ...

  3. 与 python 中的 os.system(cmd) 返回值与linux 命令返回值对应关系

    一.python中的 os.system(cmd)的返回值与linux命令返回值(具体参见本文附加内容)的关系 大家都习惯用os.systemv()函数执行linux命令,该函数的返回值十进制数(分别 ...

  4. linux wget返回值_Linux中curl命令和wget命令的使用介绍与比较

    原文链接: 这篇文章主要给大家介绍了Linux中curl命令和wget命令使用以及这两者之间的区别比较,curl和wget命令都是Linux下的工具,可以用来下载文件.文中介绍的非常详细,相信对大家具 ...

  5. shell脚本返回值及其使用场景

    应用场景 在一些应用中(比如Jenkins),嵌入了shell脚本,系统通过shell脚本的返回值来判断执行结果,如果返回值非0,则发生了执行错误,需要中止执行,这在使用单个命令时没有问题.然而,在s ...

  6. linux命令返回值的妙用

    什么是返回值 在shell终端中,你所输入的一切命令其实都有返回值,而这个返回值默认保存在"$?"中,举例看一下 [root@localhost ~]# touch 123 [ro ...

  7. linux recv返回值,recv recvfrom

    recv和recvfrom都是用来接受来自的网络的数据.来看看它们的原型: int recv( SOCKET, char FAR*, int, int ); int recvfrom( SOCKET, ...

  8. linux recv 返回值与linux socket 错误分析

    转载:http://blog.csdn.net/henry115/article/details/7054603 recv函数 int recv( SOCKET s, char FAR *buf, i ...

  9. mysql linux 函数返回值_linux recv函数返回值分析

    函数原型: ssize_t recv(int sockfd, void *buf, size_t len, int flags); 该函数第一个参数制定接收端套接字描述符; 第二个参数指明一个缓冲区, ...

最新文章

  1. php 的opcode缓存apc以及其安装
  2. UIView的clipsTobounds属性
  3. 基于 matplotlib 的抽象网格和能量曲线绘制程序
  4. 绝了!华为、H3C、锐捷交换机配置命令大全
  5. Eclipse的安装与汉化
  6. 信号处理:傅立叶变换的波形分辨率和频率分辨率
  7. 6.2二叉树及二叉树存储结构
  8. matlab ct投影数据,CT_projection_and_reconstruction
  9. 实现isnum函数python_python 学习 实现isOdd函数 实现isNum()函数 实现multi() 实现isPrime() 格式化输出日期DAY16...
  10. CSRF 攻击的对象
  11. access 数据库和mysql_access数据库和sql数据库你必须知道的区别
  12. unzip命令 – 解压缩zip文件
  13. java通过JNI调用DLL文件
  14. sigmoid和tanh激活函数与其导数的绘图详解
  15. 刺客信条3免uplay破解补丁
  16. iVX低代码平台系列制作APP简单的个人界面
  17. 苹果手机桌面找不到计算机,苹果手机在我的电脑显示不出来怎么办
  18. 给IDEA换个酷炫的主题,有点好看!
  19. javaweb面向对象
  20. 分布式服务器框架之Servers.Core库实现 DES对称加密算法;SHA1信息摘要算法;MD5信息摘要算法

热门文章

  1. bzoj3442学习小组
  2. 我的Android进阶之旅------gt;Android Studio 快捷键整理分享
  3. [转]游戏UI与flash 组件开发
  4. eigrp hello报文格式
  5. ~~~~~~~~~~~~~~坏公司鉴别方法 ~~~~~~~~~~~
  6. ios图片放大之后如何不模糊_ios uiimageview的长宽放大3倍后 图片变模糊的问题
  7. Huawei eNSP 安装教程
  8. 区块链比特币开源_开源资金:比特币,区块链和免费软件
  9. zephyr_Facebook,IBM,Yahoo和更多新闻发布的物联网Zephyr项目
  10. perl 序列化_对Perl的热爱团结了多元化的社区