Ubuntu下ProcessBuilder调用shell内置命令command报错:文件或目录不存在
问题:Java/Kotlin调用shell内置命令
command报错"No such file or directory" 问题背景
在Ubuntu 20.04.5 LTS(JDK 17)环境下,尝试通过Kotlin/Java的ProcessBuilder调用shell内置命令command来检测date命令是否存在,执行代码时触发找不到命令的错误。
复现代码
Kotlin代码
//main.kt fun main(){ val proc=ProcessBuilder("command","-v","date").start() //line 37 }
Java代码
import java.io.IOException; //rough.java public class rough { public static void main(String[] args) throws IOException { new ProcessBuilder("command","-v","date").start(); } }
报错堆栈
Exception in thread "main" java.io.IOException: Cannot run program "command": error=2, No such file or directory at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) at MainKt.main(main.kt:37) at MainKt.main(main.kt) Caused by: java.io.IOException: error=2, No such file or directory at java.base/java.lang.ProcessImpl.forkAndExec(Native Method) at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:314) at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:244) at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ... 3 more
前置验证
通过bash确认command是shell内置命令:
user@pc:~$ type command command is a shell builtin
报错原因
ProcessBuilder的工作逻辑是直接在PATH环境变量指定的目录中查找可执行文件,但command是bash的内置命令——它属于shell进程本身的一部分,并非独立存在于文件系统中的可执行程序,因此系统无法找到对应的文件,从而抛出"No such file or directory"错误。
解决方案
要执行shell内置命令,必须通过启动shell进程(如bash),让shell来解析并执行该内置命令。修正后的代码如下:
Kotlin修正版
//main.kt fun main(){ val proc = ProcessBuilder("bash", "-c", "command -v date").start() }
Java修正版
import java.io.IOException; //rough.java public class rough { public static void main(String[] args) throws IOException { new ProcessBuilder("bash", "-c", "command -v date").start(); } }
其中bash -c "command -v date"的作用是:启动bash shell进程,并让它执行引号内的完整命令字符串,此时shell会识别并执行内置的command命令。
内容的提问来源于stack exchange,提问作者lineage
相关产品推荐
相关产品推荐

