我需要在Linux机器上运行C ++代码的shell脚本。我尝试过使用system()和popen()函数。当我在dev机器上测试它们一切正常时,但是当我在实际设备上尝试相同的功能时 - 我得到错误127.从信息到目前为止它意味着,脚本解释器不可用,但实际上机器已经安装了busybox翻译在里面。我可以通过命令行运行相同的命令 - 完全没问题。当我尝试从代码中执行此操作时:
Command: sh -n '/home/test/test.sh' Status: 127
这种行为可能是什么原因? 我有可能达到某种内核限制吗?
代码示例1:
int Files::CallShell( std::string& command )
{
int status = 0;
char buff[512] = { 0 };
FILE *in;
if ( !(in = popen( command.c_str(), "r") ) )
{
printf( "Can't execute: %s\n", command.c_str() );
status = -1;
}
while ( fgets( buff, sizeof(buff), in) != NULL )
{
printf( "Result: %s\n", buff );
}
status = pclose( in );
status = ( WIFEXITED( status ) )? WEXITSTATUS( status ) : status;
printf("Command: %s Status: %d\n", command.c_str(), status );
return status;
}
代码示例2:
int Files::CallShell2( std::string& command )
{
int status = 0;
status = system( command.c_str() );
status = ( WIFEXITED( status ) )? WEXITSTATUS( status ) : status;
printf("Command: %s Status: %d\n", command.c_str(), status );
return status;
}
答案 0 :(得分:0)
system()
库函数执行/bin/sh -c
以运行传递的命令。如果/bin/sh
不存在,或者ash
未以相同方式解析参数,则会出现此错误。您可以将/bin/sh
与/bin/ash
关联起来,也可以更好地使用system()
和fork()
系列函数之一实现您自己的exec
版本,可以调用ash
而不是sh
。
答案 1 :(得分:-1)
“-n”开关用于检查shell脚本的语法...如果未设置“-i”。检查shell的手册页。至于退出状态检查。从手册页:
退出状态
shell检测到的错误(例如语法错误)将导致错误 shell以非零退出状态退出。如果shell不是 交互式shell,shell文件的执行将被中止。 Oth- 错误的shell将返回最后一个命令exe的退出状态 如果出口内置与数字参数一起使用,它将会 返回论点。