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

Jac*_*ack 11 java r system2

我无法获得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)
Run Code Online (Sandbox Code Playgroud)

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

commandResult: 127
warning message: running command '"java -jar sample.jar 674"' had status 127
Run Code Online (Sandbox Code Playgroud)

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

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

C:/Code>java -jar sample.jar 123
convert from String to int...
Input: 123
Value: 123
Conversion process done!!!
Run Code Online (Sandbox Code Playgroud)

实际的我的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!!!);
   }
}
Run Code Online (Sandbox Code Playgroud)

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

请帮我.提前致谢.

bgo*_*dst 13

这是一个容易犯的错误.

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

  • 语句     这是一段shell代码,通常表示shell执行的单个操作.该操作可以是文档化的shell内置命令或关键字命令加参数,外部可执行文件加参数的文件名,复合命令(例如支撑块或子shell),上述所有的管道或命令列表上述所有的.通常可以使用语句分隔符按顺序编码多个语句,这些语句分隔符因shell而异.例如,Unixbashshell使用分号(用于前景执行)或&符号(用于背景),而Windowscmdshell使用&符号(用于前景).
  • 命令     这是一个非常通用的术语,可以引用任何上述类型的命令,或整个语句,甚至是多个顺序语句.这是一种需要上下文来澄清其含义的术语.
  • 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是完整的命令行.

所以它们实际上使用完全相同的函数参数name(command)和description("要调用的系统命令,作为字符串."),即使参数在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');
Run Code Online (Sandbox Code Playgroud)

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

system('printf %d:%x\\\\n 31 31');
## 31:1f
system2('printf',c('%d:%x\\\\n','31','31'));
## 31:1f
Run Code Online (Sandbox Code Playgroud)

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

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

system('echo a b; echo c d');
## a b
## c d
system2('echo',c('a','b; echo c d'));
## a b
## c d
Run Code Online (Sandbox Code Playgroud)

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


ste*_*veb 11

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

system2('java', args = c('-jar', 'sample.jar', '123'),
         stdout = 'stdout.txt', stderr = 'stderr.txt')
Run Code Online (Sandbox Code Playgroud)

我在Mac OSX 10.10.5(优胜美地)上运行了这个.结果打印到"stdout.txt".

从文档中可以看出system2,第一个选项只是一个命令(即没有参数).参数将使用args参数指定.

以下是详情部分的摘录:

细节

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

...