Java Runtime.getRuntime().exec():在mkdir之后执行时,执行touch会创建一个目录

Java Runtime.getRuntime().exec():在mkdir之后执行时,执行touch会创建一个目录,java,Java,当我执行这行代码时: Runtime.getRuntime().exec(new String[] {"mkdir", "-p", "/home/stuff/Keyring", "&& touch", "/home/stuff/Keyring/keyring.gpg"}); Keyring文件夹中的messaging.gpg被创建为一个目录而不是一个文件,我不知道为什么。有什么想法吗?您正在使用以下参数执行mkdir: "-p", "/home/stuff/Keyrin

当我执行这行代码时:

    Runtime.getRuntime().exec(new String[] {"mkdir", "-p", "/home/stuff/Keyring", "&& touch", "/home/stuff/Keyring/keyring.gpg"});

Keyring文件夹中的messaging.gpg被创建为一个目录而不是一个文件,我不知道为什么。有什么想法吗?

您正在使用以下参数执行
mkdir

"-p", "/home/stuff/Keyring", "&& touch", "/home/stuff/Keyring/keyring.gpg"
exec()
的第一个参数是要执行的进程),因此-p告诉
mkdir
在需要时构建父目录,其余参数是要创建的目录。这就是你的问题(我怀疑你会在某处有一个名为“
&&touch
”的目录)

看起来您想要执行一个shell脚本,因此您需要将上述内容封装起来,例如,提供如下参数:

/bin/sh -c "mkdir -p /home/stuff/Keyring && touch /home/stuff/Keyring/keyring.gpg"
i、 e.您正在执行
/bin/sh
,并在shell命令行上提供命令


或者更好的方法是,使用
java.io.File
API或类似工具,并避免使用以下参数执行
mkdir

"-p", "/home/stuff/Keyring", "&& touch", "/home/stuff/Keyring/keyring.gpg"
exec()
的第一个参数是要执行的进程),因此-p告诉
mkdir
在需要时构建父目录,其余参数是要创建的目录。这就是你的问题(我怀疑你会在某处有一个名为“
&&touch
”的目录)

看起来您想要执行一个shell脚本,因此您需要将上述内容封装起来,例如,提供如下参数:

/bin/sh -c "mkdir -p /home/stuff/Keyring && touch /home/stuff/Keyring/keyring.gpg"
i、 e.您正在执行
/bin/sh
,并在shell命令行上提供命令


或者更好的方法是,使用
java.io.File
API或类似工具,并避免完全分叉进程?

在终端中执行命令完全可以。@Samuel这正是关键所在。终端是一个外壳。
exec()
执行的不是,除非您这样做。Runtime.exec()执行一个进程。它不在shell中执行进程。一个普遍的困惑!不过,在终端中执行命令的效果完全不错。@Samuel这正是关键所在。终端是一个外壳。
exec()
执行的不是,除非您这样做。Runtime.exec()执行一个进程。它不在shell中执行进程。一个普遍的困惑!