运行env
返回"Clear Workspace=true"。如何在bash中访问它?仅供参考,它来自Jenkins参数化构建参数名称。${Clear Workspace}
似乎不起作用。
此外,Jenkins是如何创建这个环境变量的?在bash中运行Clear Workspace=true
显然不起作用,因为它试图运行参数为"Workspace=true"的"Clear"命令。
当然,我可以将作业参数命名为Clear_Workspace,但它是以表单的形式呈现给用户的,所以我宁愿不这样做。此外,Jenkins的Maven Build插件有几个带空格的参数名称,因此必须能够以某种方式访问它们。
您可以用env
命令模拟这一点乐趣
env Clear Workspace=true bash
这将为您提供一个带有环境变量集的shell。
恢复环境变量值的一种方法是:
declare -p Clear Workspace | sed -e "s/^declare -x Clear Workspace="//;s/"$//"
从4.0开始的Bash版本将返回一个错误,并且无法以这种方式提取此类环境变量。
除此之外,您需要使用本地代码程序或脚本语言来实现它,例如
ruby -e "puts ENV['Clear Workspace']"
这就不那么让人生气了。。。如果你没有ruby
perl -e 'print "$ENV{"Clear Workspace"}n";'
还有
python -c 'import os; print os.environ["Clear Workspace"]'
这里有一个本地代码版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv, char **envp)
{
char **env;
char *target;
int len;
if (argc != 2)
{
printf("Syntax: %s namen", argv[0]);
return 2;
}
len = strlen(argv[1]);
target = calloc(len+2,sizeof(char));
strncpy(target,argv[1],len+2);
target[len++] = '=';
target[len] = '0';
for (env = envp; *env != 0; env++)
{
char *thisEnv = *env;
if (strncmp(thisEnv,target,len)==0)
{
printf("%sn",thisEnv+len);
return 0;
}
}
return 1;
}
bash并不是唯一可以操作环境的语言:
$ perl -e '$ENV{"Clear Workspace"}="true"; system "env"' | grep Clear
Clear Workspace=true
如果你在shell中,你总是可以解析env
(未测试)的输出
value=$(env | while IFS="=" read -r var value; do
if [[ $var = "Clear Workspace" ]]; then
echo "$value"
break
fi
done )
Java支持将名称中带有空格的环境变量传递给进程。这里有一个例子可以证明这一点:
给定/tmp/测试
#!/bin/sh
env > /tmp/test.out
和Test.java
import java.util.*;
import java.io.*;
public class Test {
public static void main(String[] args) throws Exception {
ProcessBuilder pb = new ProcessBuilder("/tmp/test");
Map<String, String> env = pb.environment();
env.put("a b", "true");
pb.directory(new File("/tmp"));
Process p = pb.start();
}
}
运行
> javac Test.java
> java Test
> grep "a b" /tmp/test.out
a b=true
Jenkins使用相同的功能来启动流程。
然而,对于您从纯shell访问这些内容,而不使用python、ruby等,我不确定。我还没能做到。
您可能希望将它们转换为不带空格的变量,因为它们具有更好的可移植性保证。
以下命令将返回环境变量"清除工作区"的值:
set | grep "Clear Workspace" | awk -F'=' '{print $NF}'
您可以在没有空格的情况下分配给另一个变量并用于您的目的:
export Clear_Workspace=`set | grep "Clear Workspace" | awk -F'=' '{print $NF}'`
试试看。
Jenkins可能正在创建环境变量之外的东西。
环境变量中不能有空格。报价http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html:
Shell和中的实用程序使用的环境变量名IEEE Std 1003.1-2001公用工程卷仅包含大写字母定义的字符中的字母、数字和"_"(下划线)在可移植字符集中,并且不要以数字开头。