【问题标题】:How to use Java to run a command through Mac OS Terminal如何使用 Java 通过 Mac OS 终端运行命令
【发布时间】:2020-09-23 01:53:50
【问题描述】:

我是一名高中生,正在从事一个项目,该项目会将视频从 YouTube 链接转换为 MP3 并下载。但是,YouTube格式的视频下载和转换的方式是通过Mac OS终端使用YouTube-dl。

这是我在终端中输入的:

youtube-dl -f bestvideo+bestaudio \"ytsearch:{https://www.youtube.com/watch?v=5X-Mrc2l1d0}\"

这在终端中有效,但是当我尝试使用时:

Runtime.getRuntime().exec("cd /Users/poppa/Desktop/IA Vids");

还有一个错误提示"No such file or directory"

我遇到的另一个问题是运行从 Java 输入到终端的代码。如果有帮助,我正在使用 IntelliJ IDEA。谢谢!

【问题讨论】:

  • 这取决于您在哪里运行 youtube-dl 应用程序。如果您从终端运行,它可能从其原始根文件路径路径文件夹(实际安装的位置)执行,或者借助 PATH 环境变量执行,该环境变量包括已安装的根文件路径以查找 youtube-dl 应用程序.对于 Java 应用程序,您可能需要将此安装的根文件路径与 youtube-dl 应用程序文件名连接起来。关于命令"cd /Users/zeidakel/Desktop/IA Vids",可能需要先用Java检查路径Files.exists()

标签: java youtube mp3


【解决方案1】:

目录路径中有一个空格。尝试像这样添加双引号:

Runtime.getRuntime().exec("cd \"/Users/zeidakel/Desktop/IA Vids\"");

另请注意,当(例如)使用new File("path") 创建文件时,从 JVM 执行 cd 命令可能对当前用户目录没有影响

【讨论】:

  • 恕我直言,在文件名周围加上引号几乎肯定没有帮助。 exec() 所做的标记化不够聪明,无法解析引号。你最终会得到三个 shell 参数——第二个以引号开头,第三个以一个结尾。
  • 也就是说,如果你想exec()一个带有多个参数的命令,你自己拆分命令和参数会安全得多,并使用exec()的变体,它接受一个字符串数组。
【解决方案2】:

如果cd 表示change directory(并且不是可执行文件的名称),那么即使正确执行,它也几乎肯定不会生效。 exec() 生成的进程将有一个工作目录,并且可以更改它——但该更改只会影响生成的进程。

此外,exec() 的参数中有空格本质上是有问题的。 exec() 不是 shell,您将无法通过使用引号等 shell 机制来保护字符串不被空格分割。相反,您需要自己将命令拆分为参数,知道应该在哪里拆分,然后使用exec() 的形式,将String[] 作为输入。也就是说,您自己将参数拆分为一个字符串数组,而不是依靠exec() 为您完成(错误地)。

Runtime.exec() 困难重重,需要非常小心处理。我在这里写了很多关于这个主题的文章:

http://kevinboone.me/exec.html

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 2015-06-23
    • 2020-05-18
    • 2020-10-01
    • 2012-12-25
    • 2018-08-15
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多