如何在 Linux 中设置环境变量
您可以使用 shell 变量来存储数据、设置配置选项以及自定义 Linux 下的 shell 环境。Linux 下的默认 shell 是 Bash,可用于以下用途:
- Linux 设置环境变量来配置 shell 的外观。
- 根据您使用的终端设置终端设置。
- 设置搜索路径,如JAVA_HOME和ORACLE_HOME。
- 根据程序的需要创建环境变量。
- 运行您想要在登录或注销时运行的命令。
- 设置别名和/或 shell 函数来自动执行任务,以节省输入和时间。
- 改变 bash 提示符。
- 设置 shell 选项。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 终端 |
类别 | Linux shell 脚本 |
操作系统兼容性 | AIX • Alma • Alpine • Arch • BSD • Debian • Fedora • FreeBSD • HP-UX • Linux • macOS • Mint • NetBSD • OpenBSD • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu • Unix • WSL |
预计阅读时间 | 10 分钟 |
两种类型的 shell 变量
在 Linux 中设置环境变量之前,您必须了解两种类型的 shell 变量:
- 环境变量(全局):通常,最终用户不应该弄乱环境变量,因为它们在系统范围内可用,并且子 shell 和子进程可以访问它们。在某些情况下,我们可以根据需要修改它们。例如,我们为 JAVA 应用程序设置系统范围的路径或用于搜索二进制文件的 PATH。在几乎所有情况下,我们都使用export 命令来定义或修改环境变量。
- Shell 和用户定义变量(LOCAL):顾名思义,这些变量由用户定义,当前适用于当前 shell 会话。
您可以使用以下命令在Linux操作系统中查看和配置环境。
显示 Linux 上的当前环境变量
printenv 命令显示所有或给定的环境变量。打开终端提示符,然后输入:
$ printenv
$ printenv VAR_NAME
$ printenv PS1
$ printenv ORACLE_HOME
$ printenv JAVA_HOME
# use the grep command/egrep command to filter out variables #
$ printenv | grep APP_HOME
$ printenv | grep -E 'APP_HOME|DOCKER_HOME|NIX_BACKUP_HOST'
使用 env 命令在 Linux 上设置环境变量
env 命令运行带有修改环境的 Linux 命令。语法为:
请注意,如果未按照环境规范指定命令名称,则屏幕上将显示生成的环境。这类似于前面讨论的指定 printenv 命令。例如:
# Here is how to set env variable in linux using env command #
$ env VAR_NAME=VALUE
$ env VAR_NAME=VALUE CMD1 ARG1
$ env [options] VAR_NAME=VALUE CMD1 ARG1
$ env
$ env | more
# search for PS1 environment variables in linux #
$ env | grep 'PS1'
如何使用 set 命令在 Linux 中设置和列出环境变量
env 命令/printenv 命令仅显示 Linux shell 环境变量。如果您需要查看所有变量的列表,包括 shell、环境、用户定义的 shell 函数,该怎么办?尝试使用以下 set 命令打印环境变量:
以下是我们看到的内容:
$ set
$ set | grep BASH
BASH=/bin/bash BASH_ARGC=() BASH_ARGV=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") BASH_VERSION='3.2.25(1)-release' COLORS=/etc/DIR_COLORS.xterm COLUMNS=237 CVS_RSH=ssh DIRSTACK=() EUID=0 GROUPS=() G_BROKEN_FILENAMES=1 HISTFILE=/root/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/root HOSTNAME=server3.www.p.example.com HOSTTYPE=x86_64 IFS=$' \t\n' INPUTRC=/etc/inputrc LANG=en_US.UTF-8 LESSOPEN='|/usr/bin/lesspipe.sh %s' LINES=64 LOGNAME=root LS_COLORS='no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:' MACHTYPE=x86_64-redhat-linux-gnu MAIL=/var/spool/mail/root MAILCHECK=60 OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin PIPESTATUS=([0]="0") PPID=35469 PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\007"' PS1='[\u@\h \W]\$ ' PS2='> ' PS4='+ ' PWD=/root SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 SSH_CLIENT='10.1.3.116 44212 22' SSH_CONNECTION='10.1.3.116 44212 10.10.29.68 22' SSH_TTY=/dev/pts/0 TERM=xterm UID=0 USER=root _=set consoletype=pty tmpid=0 genpasswd () { local l=$1; [ "$l" == "" ] && l=16; tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs } xrpm () { [ "$1" != "" ] && ( rpm2cpio "$1" | cpio -idmv ) }
定义$PATH命令的搜索路径。它是 shell 在其中查找命令的目录列表,以冒号分隔。定义$PS1您的提示设置。有关更多信息,请参阅所有常用 shell 变量的列表。您可以使用 printf 命令或 echo 命令显示变量的值:
echo "$HOME" echo "$PS1" printf "%s\n" "$HOME"
$HOME最后一个命令的输出显示了Linux 上环境变量设置的我的主目录位置:
/home/vivek
在 Linux 命令上设置环境变量
语法非常简单:
# A variable may be assigned to by a statement of the form # # Here is how to set environment variables in linux # VAR_NAME=value VAR_STR="this is a string" VAR_NUM_TRY=5 MY_OS="Ubuntu" DOMAIN_NAME="example.com|example.com" # If value is not given, the variable is assigned the null string. is_backup_failed= # Empty variable sql_tables="" # Boolean (true or false) is_job_failed=false
使用 bash 在 Linux 上创建或设置环境变量时需要记住的一些关键点:
- 符号周围不要留空格=。
- 与 Linux 命令一样,bash 变量的名称区分大小写。通常,我们仅以大写字母定义环境变量,这被认为是最佳实践,但这不是必需的。
- 默认情况下,Linux 变量作用域是 LOCAL。我们可以使用export 命令将它们变为 GLOBAL(或环境变量) 。
让我们使用各种命令打印先前定义的 VAR_NUM、VAR_NUM、MY_OS 和其他变量的值:
echo "$VAR_NUM" echo "$MY_OS" printf "%s\n" "$DOMAIN_NAME" echo $is_backup_failed
扰乱/删除 shell 变量和值
我们可以使用 unset 命令取消设置 shell 变量和函数的值和属性:
unset var_name unset MY_OS unset is_backup_failed
如何在 Linux 中使用 bash 设置只读环境变量
我们使用 readonly 命令如下:
readonly var=value readonly PI=3.14 export PI # Make it enviorment/global var echo "$PI" PI=4.2 bash -c "echo $PI" unset PI
在我的 Ubuntu Linux 桌面上设置不可更改的只读 bash 变量
访问子 shell 和其他实例中的用户定义变量
让我们启动一个新的 bash 实例,输入并尝试打印以下值:
# 1. Define mysql_bak_dest and _mysql_dump variables mysql_bak_dest="/aws/efs" _mysql_dump="/usr/bin/mysqldump" # 2. Print 'mysql_bak_dest' and '_mysql_dump' variables echo "$mysql_bak_dest" echo "$_mysql_dump" # 3. start a new shell bash # 4. Can you print 'mysql_bak_dest' and '_mysql_dump' variables ? echo "$mysql_bak_dest" echo "$_mysql_dump" # 5. Exit and go back parent shell session and print 'mysql_bak_dest' and '_mysql_dump' variables exit echo "$mysql_bak_dest" echo "$_mysql_dump" # 6. Can you use the printenv to print 'mysql_bak_dest', '_mysql_dump', 'HOME' variable ? printenv mysql_bak_dest printenv $_mysql_dump printenv HOME
在 Linux 上设置和列出环境本地变量
export var=value # make them GLOBAL or environment variable export mysql_bak_dest="/aws/efs" export _mysql_dump="/usr/bin/mysqldump" echo "$mysql_bak_dest" echo "$_mysql_dump" # Start a new sub-shell or instance by tping the 'bash' and try to access GLOBAL or environment vars bash -c "echo $mysql_bak_dest; echo $_mysql_dump"
在 Linux 中使用导出为当前和导出的用户 bash 会话设置环境(全局)变量
导出命令
您可以使用 export 命令修改每个环境或系统变量。设置 PATH 环境变量以包含您安装 bin 目录以及 perl 和 shell 脚本的目录:
# Here is how to add environment variable in linux to $PATH # export PATH=${PATH}:/home/vivek/bin
或者
export PATH=${PATH}:${HOME}/bin
要将JAVA_HOME 环境变量设置为安装 J2SE SDK 应用程序的目录,请输入:
export PATH=${PATH}:/usr/java/jdk1.5.0_07/bin
您可以设置多个路径,如下所示:
export ANT_HOME=/path/to/ant/dir export PATH=${PATH}:${ANT_HOME}/bin:${JAVA_HOME}/bin
关于环境和设置变量的说明
首先将 NFS_ROOT 变量设置为 /efs/ec2/wwwdata,并运行名为 check_for_files.pl 的 perl 脚本。
$ env NFS_ROOT=/efs/ec2/wwwdata check_for_files.pl
在此示例中,使用包含“LOGNAME=example”和“DISPLAY=desktop2:0”的环境运行“vim”:
$ env - DISPLAY=desktop2:0 LOGNAME=example vim /path/to/file
将 FOO 设置为 bar 并使用 perl 打印它:
$ env - FOO=bar /usr/bin/perl -e 'print "$FOO \n"'
我们无法从 shell 中看到 $FOO,因为它仅为 perl 代码定义:
$ echo "$FOO"
如何使 Linux 上的所有环境变量设置永久/持久?
当您使用控制台登录或使用 ssh 远程登录时,将执行 ($HOME/.bash_profile) 或 ~/.profile文件~/.bash_profile。键入以下命令来编辑 ~/.bash_profile 文件,输入:
$ vi ~/.bash_profile
附加 $PATH 设置,输入:
$ export PATH=${PATH}:${HOME}/bin
保存并关闭文件。
设置 IBM DB2 实例名称
键入以下命令:
export DB2INSTANCE=prod_sales
关于 /etc/profile 文件的说明
/etc/profile 或 /etc/profile.d/ 目录包含 Linux 系统范围的环境和启动程序。所有使用 bash、ksh、sh shell 的用户都可以使用它。通常用于设置 PATH 变量、用户限制和其他用户设置。它只在登录 shell 中运行。如果您想进行较大的更改或特定于应用程序的更改,请使用 /etc/profile.d/ 目录,如这里和这里所述。
请参阅以下资源:
- 从 Linux shell 脚本 wiki 定制 bash shell 环境。
- UNIX 设置环境变量
文件 | 目的 | 示例(使用cat 查看文件) |
---|---|---|
/etc/environment | 设置系统范围的环境变量。 |
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" |
/etc/profile | 适用于 Bourne shell (sh) 以及 Bourne 兼容 shell(例如 bash、ksh、ash 等)的 Linux 系统范围的 .profile 文件。 |
if [ "${PS1-}" ]; then if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then # The file bash.bashrc already sets the default PS1. # PS1='\h:\w\$ ' if [ -f /etc/bash.bashrc ]; then . /etc/bash.bashrc fi else if [ "`id -u`" -eq 0 ]; then PS1='# ' else PS1='$ ' fi fi fi if [ -d /etc/profile.d ]; then for i in /etc/profile.d/*.sh; do if [ -r $i ]; then . $i fi done unset i fi |
/etc/profile.d/ | 所有大型用户和站点特定环境的定制 都应放在此目录中。这也是系统范围的。 |
$ ls -l /etc/profile.d/ $ cat /etc/profile.d/gawk.csh gawkpath_default () { unset AWKPATH export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'` } gawkpath_prepend () { [ -z "$AWKPATH" ] && AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'` export AWKPATH="$*:$AWKPATH" } gawkpath_append () { [ -z "$AWKPATH" ] && AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'` export AWKPATH="$AWKPATH:$*" } gawklibpath_default () { unset AWKLIBPATH export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'` } gawklibpath_prepend () { [ -z "$AWKLIBPATH" ] && \ AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'` export AWKLIBPATH="$*:$AWKLIBPATH" } gawklibpath_append () { [ -z "$AWKLIBPATH" ] && \ AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'` export AWKLIBPATH="$AWKLIBPATH:$*" } |
$HOME/.bash_profile | 为登录 shell 执行的个人初始化文件。 |
/usr/bin/keychain /root/.ssh/id_ed25519 source /root/.keychain/$HOSTNAME-sh |
$HOME~/.bashrc | 每个交互式 shell 单独的启动文件。 |
PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ ' umask 022 export LS_OPTIONS='--color=auto' export PATH="$HOME:/home/vivek/bin" eval "`dircolors`" alias ls='ls $LS_OPTIONS' alias ll='ls $LS_OPTIONS -l' alias l='ls $LS_OPTIONS -lA' alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' |
$HOME/.bash_logout | 单独的登录 shell 清理文件, 在登录 shell 退出时执行 |
if [ "$SHLVL" = 1 ]; then [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q fi |
总结
您学习了如何在 Linux 上使用 bash 设置和列出环境变量:
命令 | 描述 | 示例 |
---|---|---|
declare command | 声明 bash 变量并赋予它们属性,例如 整数、索引数组、关联数组、 只读等等。如果没有给出 要声明的变量或选项,它将显示 所有变量的属性和值(与运行集相同的变量) |
参见“帮助申报”
declare declare | grep BASH declare | grep function_name # Make sure str_size have the 'integer' attribute declare -i db_size=20 echo $db_size # will print 20 db_size="foo" echo $db_size # will print 0 # Set max size for linux container and make it read-only too declare -ir MAX_MEM_FOR_CONTAINER=4096 |
env command | 在修改后的环境中运行程序。 打印所有环境变量。 |
env env | more env | grep SERVER_ROOT |
export command | 设置环境(GLOBAL)变量 并将环境导出到子 shell 或其他实例的命令。 |
export NFS_ROOT=/aws/ec2/efs |
printenv command | 打印Linux 上全部或部分(给定)的环境变量。 |
printenv SHELL printenv printenv | egrep 'SHELL|PS1|PS2' |
readonly command | 将 shell 变量标记为不可更改,即只读 或常量 shell 变量 |
readonly K_VERSION="1.9.52" |
set command | 设置或取消设置 shell 选项和位置参数的值。 此外,显示所有环境变量。 |
请参阅“帮助集”
set | more MY_DOMAINS="example.com:example.com:example.com" IFS=':' set -- $MY_DOMAINS echo "$1" echo "$2" echo "$3" for d in $@ do echo "Working on $d ..." done |
unset command | 删除 shell 和环境变量。 并非所有变量都可以取消设置。 例如,只读变量不能取消设置。 |
unset FOO |