使用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[]
    的重载。这回答了您实际提出的问题。例如,您可以通过以下方式执行与“打开带空格的路径”等效的操作:
  • 进程p=runtime.exec(新字符串[]{“打开”,“带空格的路径”});
  • 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…
    不需要执行命令--and
    export
    ,因为变量只在shell中使用,而不是在子进程中使用


    顺便说一句,即使在shell中,设置环境变量或shell变量时也不会使用
    $
    ,只有在使用变量(或某些其他内容,如命令替换或算术表达式)的值时才会使用

    在文件名中的空格前加\当您只向
    exec
    传递1个参数时,它应该是可执行文件的路径。您真的在尝试执行json文件吗?不,我尝试导出该路径,然后打开itTry runtime.exec(String.format(“export$MY_FILEPATH='%s',somePath));这也不起作用:
    java.io.IOException:无法运行程序“导出”:错误=2,没有这样的文件或目录