我需要在symlink目录中从Java运行本机进程。我们有以下目录结构:
guido@Firefly:~/work$ tree
.
└── path
└── to
└── symlink -> /home/guido/work
3 directories, 0 files
我从~/work
目录启动Java应用程序,并希望在~/work/path/to/symlink
目录中运行本机进程。
但是,如果我使用以下Java代码,符号链接工作目录将解析为real path。相反,我想在absolute path。
中运行命令(请注意,pwd
命令仅用于说明,应替换为“真实”命令(例如我的情况下为go build
)。
File baseDir = new File("/home/guido/work");
File link = new File(baseDir, "path/to/symlink");
Files.createSymbolicLink(link.toPath(), baseDir.toPath());
Process process = new ProcessBuilder()
.command("pwd")
.directory(link)
.start();
String output = getOutput(process);
System.out.println(output); // Prints: /home/guido/work
我能够通过以下解决方法满足我的需求,但启动 shell 只是为了能够触发特定目录中的简单进程看起来很愚蠢。另外,我失去了平台独立性。
String[] cmd = {"/bin/sh", "-c", "cd " + link + " && pwd"};
Process process = Runtime.getRuntime().exec(cmd);
String output = getOutput(process);
System.out.println(output); // Prints: /home/guido/work/path/to/symlink
在这里,您可以找到一个完整的示例作为unit test gist两种解决方案。
答案 0 :(得分:5)
如果我理解正确,您希望进程将符号链接视为其工作目录,而不是符号链接目标。我怀疑这是可能的。 Python也提出了类似的问题:
Prevent `os.chdir` from resolving symbolic link
首先,JVM在运行进程时不会解析符号链接。分叉后,它调用子进程中的chdir()
系统调用,并解析符号链接:
接下来,getcwd()
系统调用返回工作目录,保证返回其组件不是符号链接的路径:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html
您的解决方法适用于Bash,但它不适用于调用getcwd()
的进程。 Bash有自己的版本pwd
,我猜测它也会查看PWD
环境变量(由cd
设置)。如果您在变通方法中将pwd
修改为/usr/bin/pwd
,则会显示符号链接目标。
答案 1 :(得分:1)
正如另一个答案所示,可能没有办法让它与符号链接一起使用,但也许还有另一种方法。您可以使用绑定装载。有关详细信息,请参阅https://unix.stackexchange.com/questions/198590/what-is-a-bind-mount或https://backdrift.org/how-to-use-bind-mounts-in-linux。简而言之:
mkdir -p /path/to
mount -o bind /home/guido/work /path/to/symlink
这将在路径中安装新文件系统,作为相同目录和文件的新视图。 Java应用程序应正确解析路径。另一方面,符号链接更方便,可以在不成为root的情况下创建,因此这是一种奇特的解决方案。尽管如此,如果它足够重要,或许这是要走的路?
答案 2 :(得分:0)
这能够通过以下解决方法满足我的需求,但启动shell只是为了能够在特定目录中触发一个简单的进程看起来很愚蠢。另外,我失去了平台独立性。
String[] cmd = {"/bin/sh", "-c", "cd " + link + " && pwd"};
Process process = Runtime.getRuntime().exec(cmd);
String output = getOutput(process);
System.out.println(output); // Prints: /home/guido/work/path/to/symlink
https://gist.github.com/sw-samuraj/2c09157b8175b5a2365ae4c843690de0