运行env
会返回“Clear Workspace = true”。如何在bash中访问它?仅供参考,它来自Jenkins参数化构建参数名称。 ${Clear Workspace}
似乎不起作用。
另外,Jenkins甚至能够创建这个环境变量吗?在bash中运行Clear Workspace=true
显然不起作用,因为它尝试运行带有“Workspace = true”参数的“Clear”命令。
我当然可以创建作业参数名称Clear_Workspace,但它以一种形式呈现给用户,所以我宁愿不这样做。此外,Jenkins的Maven Build Plugin有几个带空格的参数名称,因此必须以某种方式访问它们。
答案 0 :(得分:9)
您可以使用env
命令
env Clear\ Workspace=true bash
这将为您提供一个具有环境变量集的shell。
让环境变量值退出的一种hacky方法是:
declare -p Clear\ Workspace | sed -e "s/^declare -x Clear Workspace=\"//;s/\"$//"
除此之外,你需要使用本机代码程序或脚本语言来实现它,例如。
ruby -e "puts ENV['Clear Workspace']"
哪个不那么hacky ......如果你没有红宝石
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 name\n", 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("%s\n",thisEnv+len);
return 0;
}
}
return 1;
}
答案 1 :(得分:0)
Jenkins可能正在创建除环境变量之外的某些。
您不能在环境变量中包含空格。引用http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html:
Shell中的实用程序使用的环境变量名称 IEEE Std 1003.1-2001的实用程序卷仅由大写字母组成 字母,数字和定义的字符的'_'(下划线) 在便携式字符集中,不要以数字开头。
答案 2 :(得分:0)
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 )
答案 3 :(得分:0)
Java支持将名称中带空格的环境变量传递给进程。这是一个证明它的例子:
给定/ tmp / test
#!/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 uses the same functionality to start processes
你可以从纯shell访问那些,而不使用python,ruby等,但我不确定。我还没有实现它。
您可能希望将这些转换为不带空格的变量,因为它们具有更好的可移植性保证。
答案 4 :(得分:0)
以下命令将返回环境变量的值&#34; 清除工作区&#34;:
set | grep "Clear Workspace" | awk -F'=' '{print $NF}'
您可以分配给另一个没有空格的变量并用于您的目的:
export Clear_Workspace=\`set | grep "Clear Workspace" | awk -F'=' '{print $NF}'\`
试一试。