【问题标题】:Setting null terminated string in environment variables via ProcessBuilder通过 ProcessBuilder 在环境变量中设置空终止字符串
【发布时间】:2017-02-27 17:01:34
【问题描述】:

正如标题所述,我正在尝试设置一个具有多个以空结尾的文件名的环境变量。

我的代码如下所示:

ProcessBuilder pb = new ProcessBuilder(execCmd);
Map<String, String> env = pb.environment();
env.clear();
String storedFiles = "";
Iterator<Attributes> storedSequence = info.getSequence().iterator();
while (storedSequence.hasNext()) {
    storedFiles += storedSOPSequence.next().getFilename() + "\0";
}
env.put("StoredFiles", storedFiles);

try {
    pb.start();
} catch (Exception e) {

}

但我遇到了以下异常:

Exception in thread "pool-1-thread-2" java.lang.IllegalArgumentException:
Invalid environment variable value: "/tmp/tmp.DXrJMdJmbW/53cd50f9"

有没有办法做到这一点?

【问题讨论】:

  • 您可能不需要添加空值。当它们到达您正在运行的命令时,它们将被转换为以空字符结尾的字符串。
  • 确定吗?我想要实现的是一个变量,其值如下所示:filename1\0filename2\0filename2\0...filenameN\0
  • 这不是一个好主意,因为操作系统可能会将 null 解释为字符串的结尾。如果需要带外分隔符,请使用不同的控制字符。

标签: java environment-variables processbuilder


【解决方案1】:

您不应该在字符串中使用空值作为分隔符,尤其是在将字符串传递给操作系统时。

O/S 将 null 解释为字符串结束标记,之后可能不会复制任何内容。

改用另一个控制字符(例如'\r')。

【讨论】:

  • 我现在使用空格。 env 变量中的结果字符串现在看起来像这样:“file1”“file2”“file 3”因此我可以将它包装在我调用的 bash 脚本中,如下所示: NEW_ARRAY=( $variable ) 所以我可以轻松地将它用作数组。请记住,Java 代码中的任何 " 都应转义为 \"!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2012-04-19
  • 1970-01-01
相关资源
最近更新 更多