感谢这篇帖子,它帮助了我一点
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代码中的可变价值回报。
答案 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);
}