Как вы можете получить доступ к переменной среды, которая имеет пробел в своем имени в 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}'\`
Попробуйте.