Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Shell脚本中使用带空格的路径_Java_Shell_Unix - Fatal编程技术网

Java 在Shell脚本中使用带空格的路径

Java 在Shell脚本中使用带空格的路径,java,shell,unix,Java,Shell,Unix,我正在使用shell脚本调用java程序。当调用passing java程序时,我传递的是-Dargument,它有一个指向目录的路径。这个-D参数是从文件中读取的。现在,当此路径包含空格时,我面临一个问题。我试着用引号和转义引号,但都没用 这是我的shell脚本代码test.sh D_ARG=`(tr '\r\n' ' ' < argument.dat) \#executing java code by passing above argument java ${D_AR

我正在使用shell脚本调用java程序。当调用passing java程序时,我传递的是-Dargument,它有一个指向目录的路径。这个-D参数是从文件中读取的。现在,当此路径包含空格时,我面临一个问题。我试着用引号和转义引号,但都没用

这是我的shell脚本代码test.sh

   D_ARG=`(tr '\r\n' ' ' < argument.dat)
  \#executing java code by passing above argument
   java ${D_ARG} TestProgram
当我使用set-x设置echo时,我看到shell将其转换为

  '-Dargument1="/Path' '/To' 'A/File"'
当它遇到空格时添加单引号,我得到“/To”类未找到异常。如何解决这个问题。任何建议或帮助都是非常值得欣赏的。

试试这个:

ARGS=

# Do nothing if there are no spaces; if there are spaces, surround with quotes
for arg in $(perl -pe '/ / or next; s/^/"/; s/$/"/' argument.dat); do
    ARGS="$ARGS $arg";
done

java $ARGS TestProgram
这基本上具有这样的效果,即每行中有空格时,它都会被引号包围,因此
-Da=bc
将变成
“-Da=bc”

请注意,
“-Da=bc”
严格等同于
-Da=“bc”
,甚至更奇怪的形式:

  • ”-Da='b\c
  • -D“a=b”c
  • 等等
唯一重要的是,不管输入的字符是什么,字段分隔符都会被转义。是的,这是合法的:

alias l"l=ls"\ -l

您可能会将“/Path/中的空格转义到/File”。然而,这不是一个好的解决方案,因为很多时候,我们可能会制定一个类似

system(argv[1]);/* Example is  C specific; 
      but you understand the loop-hole imparted by single escaping.
      You may require multilevel escaping, based on your implementation. OR
      We may have to escape the string, every time it is dereferenced.
      */

linux系统上更好的选择是创建符号链接

ln -s "/Path /To A/File" /tmp/file
&然后在参数文件中,使用
-Dargument1=“/tmp/file”

如果只有一个文件
“/Path/指向一个文件”
,请使用这种方法


另一种方法是使用
mount--bind

mkdir /tmp/myfiles && mount --bind "/Path /To A" /tmp/myfiles
&然后在参数文件中,使用
-Dargument1=“/tmp/myfiles/file”


这种方法将把
“/Path/装载到一个“
/tmp/myfiles
。该脚本中的所有文件和目录结构都将被保留。

该脚本在与命令eval一起使用时工作,该命令保留引号,并且不会添加任何附加的单引号

  D_ARG=`(tr '\r\n' ' ' < argument.dat)
 \#executing java code by passing above argument
  eval java ${D_ARG} TestProgram
D_ARG=`(tr'\r\n'
但是如果我在argument.dat文件中定义了多个参数,那么这两个参数都被视为单个字符串,因为您已经为参数“${D_ARG}”指定了引号,您在原始问题中没有告诉我;)在这种情况下,您的
tr
命令不是处理该问题的方法。谢谢fge。我在“java”命令(evaljava${D_ARG}TestProgram)前面使用了eval命令,解决了我的问题。谢谢你抽出时间。
  D_ARG=`(tr '\r\n' ' ' < argument.dat)
 \#executing java code by passing above argument
  eval java ${D_ARG} TestProgram