14

実行envすると、「Clear Workspace=true」が返されます。どうすればbashでアクセスできますか? 参考までに、これは Jenkins Parameterized Build パラメータ名から来ています。${Clear Workspace}動作していないようです。

また、Jenkins はどのようにしてこの環境変数を作成できるのでしょうか? 「Workspace=true」の引数を指定して「Clear」コマンドを実行しようとするため、bash での実行Clear Workspace=trueは明らかに機能しません。

もちろん、ジョブ パラメーター名を Clear_Workspace にすることもできますが、フォームでユーザーに表示されるので、できません。また、Jenkins 用の Maven Build Plugin には、スペースを含むパラメーター名がいくつかあるため、何らかの方法でそれらにアクセスできる必要があります。

4

5 に答える 5

9

envコマンドを使用して、このちょっとした楽しみをシミュレートできます

env Clear\ Workspace=true bash

これにより、環境変数が設定されたシェルが表示されます。

環境変数の値を元に戻すハックな方法は、bash 4.0 までは機能するはずです。

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

4.0 以降の Bash バージョンでは代わりにエラーが返され、そのような環境変数をその方法で抽出することはできません。

それ以外は、ネイティブコードプログラムまたはスクリプト言語を使用してそれを引き出す必要があります。

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

環境を操作できる言語は bash だけではありません。

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

シェルを使用している場合は、env(未テスト)の出力をいつでも解析できます

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

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 は同じ機能を使用してプロセスを開始します

ただし、Python、Rubyなどを使用せずに純粋なシェルからそれらにアクセスするかどうかはわかりません。私はまだそれを達成できていません。

移植性が保証されるため、これらをスペースなしで変数に変換することをお勧めします。

于 2013-08-27T15:34:56.113 に答える