14

运行env返回“Clear Workspace=true”。如何在 bash 中访问它?仅供参考,它来自 Jenkins Parameterized Build 参数名称。${Clear Workspace}似乎不起作用。

另外,Jenkins 是如何创建这个环境变量的?在 bash 中运行Clear Workspace=true显然不起作用,因为它试图运行带有“Workspace=true”参数的“Clear”命令。

我当然可以将作业参数命名为 Clear_Workspace,但它以表格形式呈现给用户,所以我宁愿不这样做。此外,Jenkins 的 Maven 构建插件有几个参数名称,其中包含空格,因此必须可以以某种方式访问​​它们。

4

5 回答 5

9

env您可以使用命令模拟这种乐趣

env Clear\ Workspace=true bash

这将为您提供一个设置了环境变量的 shell。

一个 hacky 方法,它应该适用于 bash 4.0,以获取环境变量值是:

declare -p Clear\ Workspace | sed -e "s/^declare -x Clear Workspace=\"//;s/\"$//"

从 4.0 开始的 Bash 版本将改为返回错误,并且无法以这种方式提取此类环境变量。

除此之外,您需要使用本机代码程序或脚本语言将其提取出来,例如

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;
}
于 2013-08-27T15:13:45.643 回答
1

bash 不是唯一可以操纵环境的语言:

$ perl -e '$ENV{"Clear Workspace"}="true"; system "env"' | grep Clear
Clear Workspace=true

如果你在一个 shell 中,你总是可以解析env(untested)的输出

value=$(env | while IFS="=" read -r var value; do
                  if [[ $var = "Clear Workspace" ]]; then
                      echo "$value"
                      break
                  fi
              done )
于 2013-08-27T15:13:40.440 回答
0

Jenkins 可能正在创建环境变量以外的东西

环境变量中不能有空格。引用http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html

IEEE Std 1003.1-2001 的 Shell 和 Utilities 卷中的实用程序使用的环境变量名称仅由大写字母、数字和来自 Portable Character Set 中定义的字符的“_”(下划线)组成,并且不以数字开头.

于 2013-08-27T14:55:09.267 回答
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 使用相同的功能来启动进程

但是,对于您是否可以从纯 shell 访问它们,而不使用 python、ruby 等,我不确定。我还没有实现它。

您可能希望将它们转换为不带空格的变量,因为它们具有更好的可移植性保证。

于 2013-08-27T15:34:56.113 回答
0

以下命令将返回环境变量“ Clear Workspace ”的值:

set | grep "Clear Workspace" | awk -F'=' '{print $NF}'

您可以分配给另一个没有空间的变量并用于您的目的:

export Clear_Workspace=\`set | grep "Clear Workspace" | awk -F'=' '{print $NF}'\`

试一下。

于 2015-11-24T12:11:09.827 回答