A non-shell process does not have shell variables. A C program has C variables, an
awk program has
awk variables, a Perl program has Perl variables, etc., and these are all in their own ways very much different from shell variables.
The reason another process do not have shell variables (or gets to access shell variables) is that shell variables are not exported (i.e. they are not environment variables), and also because some shells allows for attaching more information to a shell variable than just a string value, such as attributes for read-only variables, integer-only variables, etc. These type attributes (see the
typeset built-in command) can't be applied to an environment variable and be used in another process.
Some shells (like
bash) also supports arrays and associative arrays. These structures are too complex for the simple key-value pair format, where both the key (the variable name) and the value are plain text strings, imposed on environment variables, which means that these can't be exported for use in a generic other process.
All processes have access to the environment variables inherited from their parent processes. Depending on language, there are different ways for a program to access these.
A C program may use
awk program may use its associative array
ENVIRON, and a Perl program may use its
%ENV hash to access environment variables, for example.
I don't know
gedit, but in
vim, you may access environment variables with a shell-like syntax:
for example. The
echo here has nothing to do with
echo in the shell, it just happens to work in a similar way. Also, the
$HOME string just happens to be the way that
vim exposes environment variables to the user.