Linux/Unix Environment Variables

Linux/Unix environment variables

you can add them in your profile, eg ~/.bash_profile. global profile is usually located in /etc. eg /etc/profile. Take a look also at /etc/profile.d directory if you have it.

How to set environment variable for everyone under my linux system?

As well as /etc/profile which others have mentioned, some Linux systems now use a directory /etc/profile.d/; any .sh files in there will be sourced by /etc/profile. It's slightly neater to keep your custom environment stuff in these files than to just edit /etc/profile.

How to permanently set $PATH on Linux/Unix

There are multiple ways to do it. The actual solution depends on the purpose.

The variable values are usually stored in either a list of assignments or a shell script that is run at the start of the system or user session. In case of the shell script you must use a specific shell syntax and export or set commands.

System wide

  1. /etc/environment List of unique assignments. Allows references. Perfect for adding system-wide directories like /usr/local/something/bin to PATH variable or defining JAVA_HOME. Used by PAM and systemd.

  2. /etc/environment.d/*.conf List of unique assignments. Allows references. Perfect for adding system-wide directories like /usr/local/something/bin to PATH variable or defining JAVA_HOME. The configuration can be split into multiple files, usually one per each tool (Java, Go, and Node.js). Used by systemd that by design do not pass those values to user login shells.

  3. /etc/xprofile Shell script executed while starting X Window System session. This is run for every user that logs into X Window System. It is a good choice for PATH entries that are valid for every user like /usr/local/something/bin. The file is included by other script so use POSIX shell syntax not the syntax of your user shell.

  4. /etc/profile and /etc/profile.d/* Shell script. This is a good choice for shell-only systems. Those files are read only by shells in login mode.

  5. /etc/<shell>.<shell>rc. Shell script. This is a poor choice because it is single shell specific. Used in non-login mode.

User session

  1. ~/.pam_environment. List of unique assignments, no references allowed. Loaded by PAM at the start of every user session irrelevant if it is an X Window System session or shell. You cannot reference other variables including HOME or PATH so it has limited use. Used by PAM.

  2. ~/.xprofile Shell script. This is executed when the user logs into X Window System system. The variables defined here are visible to every X application. Perfect choice for extending PATH with values such as ~/bin or ~/go/bin or defining user specific GOPATH or NPM_HOME. The file is included by other script so use POSIX shell syntax not the syntax of your user shell. Your graphical text editor or IDE started by shortcut will see those values.

  3. ~/.profile, ~/.<shell>_profile, ~/.<shell>_login Shell script. It will be visible only for programs started from terminal or terminal emulator. It is a good choice for shell-only systems. Used by shells in login mode.

  4. ~/.<shell>rc. Shell script. This is a poor choice because it is single shell specific. Used by shells in non-login mode.

Notes

GNOME on Wayland starts a user login shell to get the environment. It effectively uses the login shell configurations ~/.profile, ~/.<shell>_profile, ~/.<shell>_login files.

Man pages

  • environment
  • environment.d https://linux.die.net/man/1/environment.d
  • bash
  • dash

Distribution-specific documentation

  • Ubuntu
  • Arch Linux

Difference between Login Shell and Non-Login Shell?

Unix Environment variable is not setting with execute remotely

The issue is that when you actually login to your server, you also load in environment variables such as $inf_user. But when plink.exe connects I’m guessing it is not initiating a real SSH session that would load the user profile & related environment variables.

How to solve this depends on setup & install requirements. Not familiar with how $inf_user gets set, but perhaps you can do this; I am using my local Mac OS X setup as an example. First login ti the remote Unix/Linux server and type in the following:

echo $PATH;

The output of that should be something like this:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Now in your script on the remote host add this line based on that output to the top of the file:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

That will force the script to use that PATH as the $PATH.

Also, since $inf_user is not a standard Unix/Linux variable it could be that is setup in either the .bashrc or .profile on the remote system. So you might want to check in there to see of there are any variables that can be copied.

And past all of that, I am not 100% sure on how plink.exe works, but that file.txt might be better set for bash like this:

#!/bin/bash
/folder1/folder2/test.sh

I have a funny feeling that when you login you are using the bash shell, but this script is using the basic sh shell instead which might be causing this issue as well.

Using Environment Variables in cURL Command - Unix

Single quotes inhibit variable substitution, so use double quotes. The inner double quotes must then be escaped.

...  -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"

Since this answer was written in 2015, it has become clear that this technique is insufficient to properly create JSON:

$ USERNAME=person1
$ PASSWORD="some \"gnarly 'password"
$ echo "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
{"username":"person1","password":"some "gnarly 'password"}
$ echo "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}" | jq .
parse error: Invalid numeric literal at line 1, column 47

The quoting problem are clear. The (shell) solutions are not

Current best practice: use a JSON-specific tool to create JSON:

  • jq

    $ jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named'
    {"username":"person1","password":"some \"gnarly 'password"}
  • jo

    $ jo "username=$USERNAME" "password=$PASSWORD"
    {"username":"person1","password":"some \"gnarly 'password"}

And with curl:

json=$( jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' )
# or
json=$( jo "username=$USERNAME" "password=$PASSWORD" )

# then
curl ... -d "$json"

How to convert a path containing unix environment variable to an absolute path in perl?

I would suggest just using A_VAR directly:

my $path = "$ENV{A_VAR}/this/path/file.txt";

If A_VAR may be non-absolute, that's a separate thing to handle - there are many modules that do this work, depending on how you like to interact with it. File::Spec, Path::Tiny, etc.

Set environment variables from file of key/value pairs

Problem with your approach is the export in the while loop is happening in a sub shell, and those variable will not be available in current shell (parent shell of while loop).

Add export command in the file itself:

export MINIENTREGA_FECHALIMITE="2011-03-31"
export MINIENTREGA_FICHEROS="informe.txt programa.c"
export MINIENTREGA_DESTINO="./destino/entrega-prac1"

Then you need to source in the file in current shell using:

. ./conf/prac1

OR

source ./conf/prac1


Related Topics



Leave a reply



Submit