无法获取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)。

请帮助我。 提前致谢。

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

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

我在 Mac OSX 10.10.5 (Yosemite) 上 运行。结果打印到"stdout.txt".

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

这是详细信息部分的片段:

Details

Unlike system, command is always quoted by shQuote, so it must be a single command without arguments.

...

这是一个容易犯的错误。

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

  • 语句 这是一段 shell 代码,通常表示 shell 的单个操作执行。该操作可以是记录的 shell 内置命令或关键字命令加参数、外部可执行文件的文件名加参数、复合命令(例如花括号块或 subshell)、所有的管道以上,或以上所有的命令列表。多条语句通常可以使用语句分隔符按顺序编码,语句分隔符相差shell。例如,Unix bash shell 使用分号(用于前台执行)或&符号(用于后台),而 Windows cmd shell 使用&符号(用于前景)。
  • command 这是一个非常笼统的术语,可以指代上述任何类型的命令,或指代整个语句,甚至多个顺序语句。这是一种需要上下文来阐明其含义的术语。
  • 简单命令 这是一个只执行 shell 内置或外部可执行文件的命令。这些可能作为它们自己的语句出现,或者它们可能构成复合命令、管道或命令列表的一部分。在 bash shell 中,变量赋值和重定向可以构成一个简单命令的一部分甚至全部。
  • 命令词 在单个简单命令的上下文中,这是你要运行的程序名。这将是 shell 内置文件的文件名,或者是外部可执行文件的文件名。这有时被描述为命令的第一个词,或第零个参数
  • 命令参数 在单个简单命令的上下文中,这是给内置或可执行文件的零个或多个(附加)参数。
  • 命令行 这个词暗示它指的是单行 的 shell 代码。然而,它经常被稍微宽松地使用,来描述任何自包含的,通常是一次性的 shell 代码,实际上可能包含换行符,因此在技术上由不止一个文本行组成。术语 command 有时也用作此概念的 shorthand,进一步增加了它的歧义。另请注意,命令行 有时用作 command-line interface 类型用户界面的 shorthand,这永远不会由不合格术语 command.
  • 表示
  • 系统命令 这是另一个通用术语,需要上下文来阐明其含义。它可以被认为是 command 的同义词,除了附加修饰符 "system" 表示命令的执行是从一个存在于 shell 之外的编程上下文,例如 R 会话。

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

command

     the system command to be invoked, as a character string.

args

     a character vector of arguments to command.

以上并没有说得很清楚,但详细信息部分的第一句话有帮助:

Unlike system(), command is always quoted by shQuote(), so it must be a single command without arguments.

如您所见,该文档有点含糊,因为它抛出了通用术语 command 而没有太多说明。他们还使用模糊术语系统命令,这也无济于事。他们的意思是第一个函数参数 command 命令字 简单命令。如果您想传递任何 命令参数 ,您必须在第二个函数参数 args.

中指定它们

在作者的辩护中,shell 代码在实现和行为上可能非常依赖于平台并且不一致。使用我在此 post 中定义的更精确的术语会使文档编写者面临犯错的风险,至少对于 R 渴望支持的某些系统而言。含糊不清是避免完全错误风险的避风港。

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

command

     the system command to be invoked, as a character string.

在详细信息部分:

command is parsed as a command plus arguments separated by spaces. So if the path to the command (or a single argument such as a file path) contains spaces, it must be quoted e.g. by shQuote(). Unix-alikes pass the command line to a shell (normally ‘/bin/sh’, and POSIX requires that shell), so command can be anything the shell regards as executable, including shell scripts, and it can contain multiple commands separated by ;.

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

所以他们实际上使用完全相同的函数参数名称(command)和描述("the system command to be invoked, as a character string."),即使参数在system()和[=之间具有两个完全不同的含义15=]!理解本文档确实需要 reader.

仔细解析

所以,最后,我们可以了解如何正确使用 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

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