Java 在groovy中,由于命令在文件arg中有空格,运行进程失败

Java 在groovy中,由于命令在文件arg中有空格,运行进程失败,java,bash,groovy,process,Java,Bash,Groovy,Process,这是groovy并不重要。当我执行一个包含嵌入空格的文件参数的命令时,该命令失败。但是,我可以pwd。我还可以从命令行运行完全相同的命令。这是在LinuxMint上运行的——同样,这并不重要。下面是我日志中的一个片段,显示了pwd命令和第二个命令(flac通过管道传输到lame) 在flac或lame命令中,它似乎并不喜欢歌曲名称中嵌入的空格。它似乎也不喜欢这根管子 该命令在命令行中运行良好 worldwidewilly@hal9000 ~/Music/album-rip/Dixie Cups,

这是groovy并不重要。当我执行一个包含嵌入空格的文件参数的命令时,该命令失败。但是,我可以pwd。我还可以从命令行运行完全相同的命令。这是在LinuxMint上运行的——同样,这并不重要。下面是我日志中的一个片段,显示了pwd命令和第二个命令(flac通过管道传输到lame)

在flac或lame命令中,它似乎并不喜欢歌曲名称中嵌入的空格。它似乎也不喜欢这根管子

该命令在命令行中运行良好

worldwidewilly@hal9000 ~/Music/album-rip/Dixie Cups, The $ flac -cd "Iko Iko".flac | lame -b 320 - "Iko Iko".mp3

flac 1.3.0, Copyright (C) 2000-2009, 2011-2013  Josh Coalson & Xiph.Org Foundation
flac comes with ABSOLUTELY NO WARRANTY.  This is free software, and you are
welcome to redistribute it under certain conditions.  Type `flac' for details.

Iko Iko.flac: done         
LAME 3.99.5 64bits (http://lame.sf.net)
Using polyphase lowpass filter, transition band: 20094 Hz - 20627 Hz
Encoding <stdin> to Iko Iko.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (4.4x) 320 kbps qval=3
下面是我当前的日志文件:

2017-06-27T15:12:42.436 mp3FromFlac Iko Iko.flac
2017-06-27T15:12:42.437 mp3FromFlac: flacCmd: flac -cd "Iko Iko".flac
2017-06-27T15:12:42.437 mp3FromFlac: lameCmd: lame -b 320 -q 0 - "Iko Iko".mp3
2017-06-27T15:12:42.437 mp3FromFlac: cmd: sh -c 'flac -cd "Iko Iko".flac | lame -b 320 -q 0 - "Iko Iko".mp3'
2017-06-27T15:12:42.479 mp3FromFlac: OUT: 
2017-06-27T15:12:42.480 mp3FromFlac: ERROR: -cd: 1: -cd: Syntax error: Unterminated quoted string

由于您没有指定如何从Groovy调用它,所以我只测试了一些变量:

/cat foo bar/.execute().err.text

Result: cat: foo: No such file or directory
cat: bar: No such file or directory





因此,如果使用引号,它们会正确地转义空格。但您当然不能使用管道,因为这是一个shell构造。因此,您要么在
sh-c
中包装调用,要么在Groovy中而不是在命令中进行管道处理。

由于您没有指定如何尝试从Groovy调用它,我只是测试了一点以向您展示变体:

/cat foo bar/.execute().err.text

Result: cat: foo: No such file or directory
cat: bar: No such file or directory





因此,如果使用引号,它们会正确地转义空格。但您当然不能使用管道,因为这是一个shell构造。因此,你要么用
sh-c
来结束你的呼叫,要么用Groovy而不是你的命令来完成配管。

所以,多亏了@Vampire和@dagget,我有足够的信息来自己解决这个问题。这就填补了缺失的部分。我以前做过,但很久以前。不管怎样,以下是我编写的代码:

def cmd = ['/bin/bash', '-c', /flac -cd "${name}".flac | lame -b 320 -q 0 - "${name}".mp3/]
log "mp3FromFlac: cmd: ${cmd}"

proc = cmd.execute(null, new File(path_to_song))

是的,我本可以在flac和lame命令中包含路径,但我已经准备好了,这不是问题。

所以,多亏了@Vampire和@dagget,我有足够的信息自己解决这个问题。这就填补了缺失的部分。我以前做过,但很久以前。不管怎样,以下是我编写的代码:

def cmd = ['/bin/bash', '-c', /flac -cd "${name}".flac | lame -b 320 -q 0 - "${name}".mp3/]
log "mp3FromFlac: cmd: ${cmd}"

proc = cmd.execute(null, new File(path_to_song))

是的,我本可以在flac和lame命令中包含路径,但由于我已经准备好了,这不是问题。

问题不在空格中。如何使用groovy中的管道执行命令确实很重要<代码>|-管道是外壳的一部分。您必须在命令前面加上
sh-c…
bash-c…
问题不在空格中。如何使用groovy中的管道执行命令确实很重要<代码>|-管道是外壳的一部分。您必须在命令前面加上
sh-c…
bash-c…
/cat 'foo bar' | wc -l/.execute().err.text

Result: cat: unknown option -- l
Try 'cat --help' for more information.
/sh -c 'cat "foo bar" | wc -l'/.execute().err.text

Result: cat: 'foo bar': No such file or directory
(/cat 'foo bar'/.execute() | /wc -l/.execute()).in.text

Result: 0
def cmd = ['/bin/bash', '-c', /flac -cd "${name}".flac | lame -b 320 -q 0 - "${name}".mp3/]
log "mp3FromFlac: cmd: ${cmd}"

proc = cmd.execute(null, new File(path_to_song))