使用java的bash路径中的空格
因此,我尝试导出文件变量:使用java的bash路径中的空格,java,bash,command-line-interface,whitespace,Java,Bash,Command Line Interface,Whitespace,因此,我尝试导出文件变量: String somePath = "/Users/me/File with whitespaces.json"; Runtime runtime = Runtime.getRuntime(); runtime.exec(String.format("$MY_FILEPATH=\"%s\"", somePath)); 我在这一行遇到了一些例外: java.io.IOException: Cannot run program "$MY_FILEPATH=/Users
String somePath = "/Users/me/File with whitespaces.json";
Runtime runtime = Runtime.getRuntime();
runtime.exec(String.format("$MY_FILEPATH=\"%s\"", somePath));
我在这一行遇到了一些例外:
java.io.IOException: Cannot run program "$MY_FILEPATH=/Users/me/File": error=2, No such file or directory
The files /Users/me/File\, with\, whitespaces.json do not exist.
附言。
如果我尝试“在文件名中的空格前加\”,我会得到: 我在这一行也有一些例外:
java.io.IOException: Cannot run program "$MY_FILEPATH=/Users/me/File": error=2, No such file or directory
The files /Users/me/File\, with\, whitespaces.json do not exist.
p.p.S
若我将路径包装为“”,我也会得到类似上面的异常
运行时.exec
不是shell
Runtime.exec
的重载,在空白处使用字符串
标记。时期shell默认标记为空白,但可以用引号或反斜杠覆盖;在Runtime.exec中,它不能。如果需要任何其他标记化,则必须使用采用String[]
的重载。这回答了您实际提出的问题。例如,您可以通过以下方式执行与“打开带空格的路径”等效的操作:
Runtime.exec
仅运行程序。Shell命令通常运行程序,但并不总是这样export
是shell执行的shell内置程序,但不是程序,因此Runtime.exec
无法执行Runtime.exec
在子进程中运行程序,就像一个shell。即使您可以以某种方式作为子进程运行export
,它所做的更改也只会存在于该子进程中。它不会影响Java进程或从Java进程运行的任何其他程序,就像在子进程中使用shell进行导出一样——最简单的是使用括号的子shell,如(export foo=bar;echo$foo);echo$foo
——那么它只在子shell进程中设置,而不在父shell中设置,也不在父shell的任何其他子shell中设置Runtime.exec
中运行任何程序来实现。您可以通过使用带有envp
参数的重载,将修改后的环境传递给使用Runtime.exec
运行的其他(真实)程序,以添加(或更改或删除)环境变量--请参见--ProcessBuilder
使用environment()
方法
但是如果你的目标是做与shell的foo='path with spaces'等价的事情;打开“$foo”
(注意,要在shell中工作,需要使用引号),您不能这样做。用空格将$foo
替换为路径(在标记内,因此作为参数传递)是由shell完成的,而不是由open
程序完成的,Runtime.exec
不是shell,因此它不会执行此操作。您必须像上面第1点那样,自己用空格传递路径标记/参数,或者显式运行shell(通常是/bin/sh
,或者只是sh
),并将foo=$foo…
不需要执行命令--andexport
,因为变量只在shell中使用,而不是在子进程中使用
顺便说一句,即使在shell中,设置环境变量或shell变量时也不会使用$
,只有在使用变量(或某些其他内容,如命令替换或算术表达式)的值时才会使用 在文件名中的空格前加\当您只向exec
传递1个参数时,它应该是可执行文件的路径。您真的在尝试执行json文件吗?不,我尝试导出该路径,然后打开itTry runtime.exec(String.format(“export$MY_FILEPATH='%s',somePath));这也不起作用:java.io.IOException:无法运行程序“导出”:错误=2,没有这样的文件或目录