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

mzaanser  于 2023-03-20  发布在  R语言
关注(0)|答案(3)|浏览(143)

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

执行_系统.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)。
请帮帮我,先谢了.

kcrjzv8t

kcrjzv8t1#

这是一个很容易犯的错误。
首先,让我们定义一些术语:

声明 这是一段shell代码,通常表示shell要执行的单个操作。该操作可以是文档化的shell内置命令或关键字命令加参数、外部可执行文件名加参数、复合命令(如支撑块或副壳),上述所有管道,或以上所有命令的命令列表。多个语句通常可以使用语句分隔符按顺序编码,分隔符因 shell 而异。例如,Unix bash shell使用分号(用于前台执行)或&符号(用于后台),而Windows cmd shell使用&符号(用于前台)。
命令 这是一个非常通用的术语,可以指上述任何类型的命令,也可以指整个语句,甚至可以指多个连续的语句。这类术语需要上下文来阐明其含义。
简单命令 这是一个只执行shell内置或外部可执行文件的命令。这些命令可以作为自己的语句出现,也可以构成复合命令、管道或命令列表的一部分。在bash shell中,变量赋值和重定向可以构成简单命令的一部分甚至全部。
命令字 在单个简单命令
的上下文中,这是您要运行的程序的名称。这可以是 shell 内置程序的文档名称,也可以是外部可执行文件的文件名。有时将其描述为命令的 * 第一个单词 * 或 * 第零个参数
命令参数 在单个简单命令
的上下文中,这是给内置或可执行文件的零个或多个(附加)参数。
命令行 这个术语意味着它指的是一行shell代码。但是,它通常使用得稍微宽松一些,用来描述任何独立的、通常是一次性的shell代码,这些代码实际上可能包含换行符,因此从技术上讲,它们包含不止一个文本行。术语命令
有时也用作这个概念的简写。还请注意,***命令行
有时被用作command-line interface类型用户界面的简写,它从来没有被非限定术语命令所隐含。
系统命令 这是另一个需要上下文来阐明其含义的通用术语。它可以被视为
命令
**的同义词,只是附加的修饰语“system”表明命令的执行是从shell外部的编程上下文启动的,如R会话。

system2()函数的设计似乎表明作者只打算将其用于运行***简单命令***。它将***命令字***作为第一个函数参数(应为标量字符串,表示单元素字符向量),命令参数***作为第二个(也可以是一个字符向量,零个或多个元素)。下面是文档在这两个函数参数的描述中如何放置它的:
command
要调用的系统命令,作为字符串。
args
command的参数的字符向量。
上面的内容并没有说得很清楚,但是细节部分的第一句话很有帮助:
system()不同,command总是被shQuote()引起来,因此它必须是一个没有参数的命令。
正如您所看到的,该文档有点模糊,因为它使用了一般术语***命令
,但没有太多说明。他们还使用了模糊术语***系统命令***,这也没什么用,它们的意思是第一个函数参数command,是一个简单命令的命令字。如果要传递任何***命令参数***,必须在第二个函数参数args中指定它们。
在作者的辩护中,shell代码可能非常依赖于平台,并且在实现和行为上不一致。使用我在这篇文章中定义的更精确的术语将使文档编写者处于犯错误的风险中,至少对于R渴望支持的一些系统来说是这样。模糊可以是防止彻底错误风险的安全屋。
注意,这与其他R系统命令函数system()不同:
command
要调用的系统命令,作为字符串。
在“详细信息”部分中:
command被解析为一个命令加上用空格分隔的参数。(或单个参数,如文件路径)包含空格,则必须将其括起来,例如用shQuote()括起来。Unix类将命令行传递给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

(Note反斜杠的四倍是必要的,因为它们经过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

这当然是极不可取的。

hfyxw5xn

hfyxw5xn2#

使用您的代码,它为我工作,没有错误,当我做以下:

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

我在MacOSX 10. 10. 5(约塞米蒂国家公园)上运行了这个。结果被打印到“StdoutIdenttxt”。
system2的文档中可以看出,第一个选项只是一个命令(即没有参数)。参数将使用args参数指定。
以下是详细信息部分的一个片段:

详细信息

与system不同,command总是用shQuote引起来,因此它必须是一个没有参数的命令。
...

nfeuvbwi

nfeuvbwi3#

如果只想将结果发送到R控制台,请添加stdout参数:

system2("your command", stdout=TRUE)

相关问题