Как вы можете получить доступ к переменной среды, которая имеет пробел в своем имени в bash?

Запуск env возвращает "Clear Workspace = true". Как я могу получить к нему доступ в bash? FYI, он исходит из имени параметра параметрической конструкции Jenkins. ${Clear Workspace} не работает.

Кроме того, как Дженкинс даже способен создать эту переменную среды? Выполнение Clear Workspace=true в bash явно не работает, поскольку он пытается запустить команду "Очистить" с аргументом "Workspace = true".

Я мог бы, конечно, указать имя параметра работы Clear_Workspace, но он был представлен в форме пользователю, поэтому я бы предпочел не делать этого. Кроме того, Maven Build Plugin для Jenkins имеет несколько имен параметров с пробелами в них, поэтому их можно каким-то образом получить к ним.

Ответ 1

Вы можете имитировать этот бит веселья с помощью команды env

env Clear\ Workspace=true bash

Это даст вам оболочку с набором переменных среды.

Хакерный способ вернуть значение переменной среды:

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

Кроме этого вам нужно будет использовать либо программу нативного кода, либо язык сценариев, чтобы вытащить ее, например

ruby -e "puts ENV['Clear Workspace']"

Что гораздо менее взломанно... также, если у вас нет рубина

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;
}

Ответ 2

Дженкинс, вероятно, создает нечто, отличное от переменной среды.

В переменных среды не может быть пробелов. Цитирование http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html:

Имена переменных среды, используемые служебными программами в Shell и Утилиты IEEE Std 1003.1-2001 состоят исключительно из прописных буквы, цифры и символ "_" (подчеркивание) из символов, определенных в переносном наборе символов и не начинайте с цифры.

Ответ 3

bash - не единственный язык, который может управлять средой:

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

Если вы находитесь в оболочке, вы всегда можете проанализировать вывод env (untested)

value=$(env | while IFS="=" read -r var value; do
                  if [[ $var = "Clear Workspace" ]]; then
                      echo "$value"
                      break
                  fi
              done )

Ответ 4

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();
    }
}

run

> javac Test.java
> java Test
> grep "a b" /tmp/test.out 
a b=true

Дженкинс использует ту же функциональность для запуска процессов.

Для доступа к ним из чистой оболочки без использования python, ruby ​​и т.д., однако, я не уверен. Я еще не смог этого достичь.

Возможно, вы захотите преобразовать их в переменную без пробелов, поскольку они имеют лучшую гарантию на переносимость.

Ответ 5

Следующая команда вернет значение переменной среды Очистить рабочее пространство ":

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

Вы можете назначить другую переменную без пробела и использовать для своей цели:

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

Попробуйте.