繁体   English   中英

无法获得R语言system2命令结果

[英]Unable to get R language system2 command result

我无法获得system2结果。 试图执行示例jar文件。

execute_system.R:

workingDir <- "C:/Code"
setwd(workingDir)
command <- "java -jar sample.jar 674"
commandResult <- system2(command, stdout="C:/Code/stdout.txt", stderr="C:/Code/stderr.txt")
cat("commandResult: ", commandResult)

我执行此execute_system.R文件并生成空文件时收到错误消息(stdout.txt,stderr.txt)

commandResult: 127
warning message: running command '"java -jar sample.jar 674"' had status 127

我想读取system2命令结果,需要处理结果数据。

当我执行相同的命令提示符时,我得到了正确的结果

C:/Code>java -jar sample.jar 123
convert from String to int...
Input: 123
Value: 123
Conversion process done!!!

实际的我的Java代码

public class Conversion{
   public static void main(String args[]){
      System.out.println("convert from String to int...");
      String input = args[0];
      System.out.println("Input: " + input );
      int value = Integer.valueOf(input)
      System.out.println("Value: " + value);
      System.out.println("Conversion process done!!!);
   }
}

我将这个java程序转换为可执行的jar文件(sample.jar)。

请帮我。 提前致谢。

这是一个容易犯的错误。

首先,让我们定义一些术语:

  • 语句这是一段shell代码,通常表示shell执行的单个操作。 该操作可以是文档化的shell内置命令或关键字命令加参数,外部可执行文件加参数的文件名,复合命令(例如支撑块或子shell),上述所有的管道或命令列表上述所有的。 通常可以使用语句分隔符按顺序编码多个语句,这些语句分隔符因shell而异。 例如,Unix bash shell使用分号(用于前台执行)或&符号(用于后台),而Windows cmd shell使用&符号(用于前景)。
  • 命令这是一个非常通用的术语,可以引用任何上述类型的命令,或整个语句,甚至是多个顺序语句。 这是一种需要上下文来澄清其含义的术语。
  • simple command这是一个只执行shell内置或外部可执行文件的命令。 这些可能作为自己的语句出现,也可能构成复合命令,管道或命令列表的一部分。 在bash shell中,变量赋值和重定向可以构成简单命令的一部分甚至整个。
  • 命令字在单个简单命令的上下文中,这是您要运行的程序的名称。 这将是shell内置的文档名称,或者它将是外部可执行文件的文件名。 这有时被描述为命令的第一个单词或第0个参数
  • 命令参数在单个简单命令的上下文中,这是给予内置或可执行文件的零个或多个(附加)参数。
  • 命令行这个术语带有它引用单行 shell代码的建议。 然而,它通常稍微松散地用于描述任何自包含的,通常是一次性的shell代码,其实际上可能包含换行符,因此在技术上由多个文本行组成。 术语命令有时也被用作这个概念的简写,进一步增加了它的模糊性。 另请注意, 命令行有时用作命令行界面类型的用户界面的简写,永远不会被非限定术语命令所暗示。
  • system命令这是另一个通用术语,需要上下文来阐明其含义。 它可以被认为是命令的同义词,除了附加修饰符“系统”表明命令的执行是从存在于shell之外的编程上下文(例如R会话)启动的。

system2()函数的设计似乎表明作者只打算用它来运行简单的命令 它将命令字作为第一个函数参数(预期为标量字符串,表示单元素字符向量),将命令参数作为第二个(也可以是字符向量,零个或多个元素)。 以下是文档如何将它放在这两个函数参数的描述中:

command

要调用的系统命令,作为字符串。

args

command参数的字符向量。

以上内容并不十分清楚,但详细信息部分的第一句话有助于:

system()不同, command总是由shQuote()引用,因此它必须是没有参数的单个命令。

正如您所看到的,文档有点模糊,因为它抛出了一般术语命令而没有做太多澄清。 他们还使用模糊的术语系统命令 ,这也无济于事。 它们的含义是第一个函数参数command旨在成为简单命令命令字 如果要传递任何命令参数 ,则必须在第二个函数参数args指定它们。

在作者的辩护中,shell代码可能非常依赖于平台,并且在实现和行为方面不一致。 使用我在本文中定义的更精确的术语会使文档编写者面临犯错的风险,至少对于R希望支持的某些系统而言。 模糊性可以成为抵御彻底错误风险的安全措施。

请注意,这与其他R系统命令函数system()

command

要调用的系统命令,作为字符串。

在详细信息部分:

command被解析为命令加上由空格分隔的参数。 因此,如果命令的路径(或单个参数,如文件路径)包含空格,则必须引用它,例如shQuote() Unix-alikes将命令行传递给shell(通常是' /bin/sh ',POSIX需要shell),因此command可以是shell认为可执行的任何东西,包括shell脚本,它可以包含多个命令,由;分隔;

因此对于system() ,第一个函数参数command是一个完整的命令行

所以它们实际上使用完全相同的函数参数名称( command )和描述(“要调用的系统命令,作为字符串。”),即使参数在system()system2()之间有两个完全不同的含义! 理解这个文档确实需要读者仔细解析。


所以,最后,我们可以理解如何正确使用system2()来调用所需的java命令:

word <- 'java';
args <- c('-jar','sample.jar','674');
result <- system2(word,args,stdout='C:/Code/stdout.txt',stderr='C:/Code/stderr.txt');

只是为了进一步澄清,通过尝试一些简单的测试用例来试验这些函数的行为是有帮助的。 例如(在我的Cygwin bash shell上):

system('printf %d:%x\\\\n 31 31');
## 31:1f
system2('printf',c('%d:%x\\\\n','31','31'));
## 31:1f

(注意,反斜杠的四倍是必要的,因为它们通过3个插值上下文,即(1)R字符串文字插值,(2)bash(非单引号)词汇上下文,以及(3) printf命令的插值第一个命令参数。我们需要printf来插入最后的\\n ASCII字符代码。)

此外,应该注意的是,尽管system2()明确鼓励仅通过强制将命令字命令参数分离为单独的函数参数来运行简单命令 ,但很有可能颠覆该意图并使用shell元字符来执行一些明确的非- 通过system2()接口简单的shell代码:

system('echo a b; echo c d');
## a b
## c d
system2('echo',c('a','b; echo c d'));
## a b
## c d

当然,这是非常不可取的。

使用您的代码,当我执行以下操作时,它对我没有任何错误:

system2('java', args = c('-jar', 'sample.jar', '123'),
         stdout = 'stdout.txt', stderr = 'stderr.txt')

我在Mac OSX 10.10.5(约塞米蒂)上运行了这个。 结果打印到“stdout.txt”。

system2的文档看来,第一个选项只是一个命令(即没有参数)。 参数将使用args参数指定。

以下是详情部分的摘录:

细节

与system不同,命令总是由shQuote引用,因此它必须是没有参数的单个命令。

...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM