How can you access an environment variable that has a space in its name in bash?
bash is not the only language that can manipulate the environment:
$ perl -e '$ENV{"Clear Workspace"}="true"; system "env"' | grep Clear
Clear Workspace=true
If you're in a shell, you can always parse the output of env
(untested)
value=$(env | while IFS="=" read -r var value; do
if [[ $var = "Clear Workspace" ]]; then
echo "$value"
break
fi
done )
You can simulate this bit of fun with the env
command
env Clear\ Workspace=true bash
That will give you a shell with the environment variable set.
A hacky way, which should work up to bash 4.0, to get the environment variable value back out is:
declare -p Clear\ Workspace | sed -e "s/^declare -x Clear Workspace=\"//;s/\"$//"
Bash versions starting with 4.0 will instead return an error and are unable to extract such environment variables in that way.
Other than that you'd need to use either a native code program or a scripting language to pull it out, e.g.
ruby -e "puts ENV['Clear Workspace']"
Which is much less hacky... also if you don't have ruby
perl -e 'print "$ENV{\"Clear Workspace\"}\n";'
also
python -c 'import os; print os.environ["Clear Workspace"]'
And here is a native code version:
#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;
}