从Shell脚本中收集返回值

时间:2014-04-11 11:44:40

标签: c shell embedded-linux

感谢这篇帖子,它帮助了我一点

returning value from called function in shell script

我写了如下代码:

File.c

i = system("/home/ubuntu/Documents/Flash_Desk_App/Project/test.sh -c");
printf("SH = %x",i);

test.sh

ONE=1   
echo " Hello world "        
clean()
    {        
    CLEAN_FLAG=1
    echo $ONE
    return "$ONE"    
    }

option="${1}"
case ${option} in
      -c) 
echo "Cleaning"
clean
;;  
    *) echo "Usage"
usage
;;
esac

但是当我执行我的./a.out时,这就是输出

Hello world 
Cleaning
1
SH = 0

始终打印0。 我可以帮助解决这个问题。我希望收集壳牌在我的C代码中的可变价值回报。

3 个答案:

答案 0 :(得分:3)

这是因为脚本退出时返回代码为0(成功)。为每个执行的命令更新命令的退出状态。如果要以clean命令的状态退出,则需要在脚本中执行以下操作:

编辑 - 包括查看确切更改的完整代码:

ONE=1   
echo " Hello world "  

# Initialize RC
rc=0

clean()
    {        
    CLEAN_FLAG=1
    echo $ONE
    return "$ONE"    
    }

option="${1}"
case ${option} in
      -c) 
echo "Cleaning"

# Run the clean command and capture the return code
clean
rc=$?

;;  
    *) echo "Usage"
usage
;;
esac

# Return the captured return code as our script's exit status.
exit $rc

然后它应该工作。

注意:您可能在C代码中获得不同的值(如127),而不是1.在shell退出代码和来自C的系统调用的返回值之间存在奇怪的映射。

从bash shell执行此脚本的示例:

$ ./test.sh -c
 Hello world 
Cleaning
1
$ echo $?
1

因此,它可以作为来自C的系统调用执行,您可以获得返回代码。

答案 1 :(得分:1)

除了 Trenin answer中提到的事实外,将宏WEXITSTATUS应用于system()返回的值以获取值由它执行的命令返回。

来自man 3 system

  

返回值

     

错误时返回的值为-1(例如,fork(2)失败),否则返回命令的返回状态。后一种返回状态采用wait(2)中指定的格式。因此,退出代码          该命令将是WEXITSTATUS(状态)。如果无法执行/ bin / sh,退出状态将是退出(127)的命令。

这里学到的经验是: RTFM

答案 2 :(得分:0)

以上答案都应该这样做。最好先确保使用bash脚本获得正确的返回值。

# ./test.sh -c

# echo $?
1

(你总是可以改变ONE = 1) 然后用你的C代码测试它。(不要忘记将(系统)调用的返回值传递给WEXITSTATUS(i))以获得正确的返回值。

{
    i = system("/home/ubuntu/Documents/Flash_Desk_App/Project/test.sh -c");
    i = WEXITSTATUS(i);
    printf("SH = %x",i);
}