环境变量操作命令
- 系统启动后会在内核中生成一份默认的环境变量,环境变量名和默认值由源程序决定。
- 系统启动后如果文件系统中存在有效的
/etc/profile
文件,则还会自动读取文件中的内容,并导入到 Shell 环境中,覆盖对应变量或增加新的变量。 - 程序运行时,以系统内的环境变量表为准而不是以
/etc/profile
文件为准,所以直接修改/etc/profile
文件后需要通过varload
命令重新加载才能生效。 vars
命令用于查看系统内当前环境变量表。varload
命令用于加载某文件来配置系统环境变量,不指定文件参数则默认使用/etc/profile
文件。varsave
命令用于将系统环境变量保存到指定文件,不指定文件参数则默认保存到/etc/profile
文件中。对于SYSTEM
,VERSION
,LICENSE
,TMPDIR
,KERN_FLOAT
这 5 个环境变量,它们是由内核自动生成的,varsave
命令保存时会自动跳过。
[root@sylixos:/root]# varload
environment variables load from /etc/profile fail, error: No such file or directory
[root@sylixos:/root]# varload /etc/profile_back
environment variables load from /etc/profile_back success.
[root@sylixos:/root]# varsave
environment variables save to /etc/profile success.
[root@sylixos:/root]#
[root@sylixos:/root]# cat /etc/profile
#sylixos environment variables profile.
DISPLAY="/dev/fb0"
XINPUT_PRIO="199"
QTDIR="/qt"
QPEDIR="/qt"
QWS_DISPLAY="sylixosfb:/dev/fb0"
QWS_MOUSE_PROTO="sylixosinput"
QWS_KEYBOARD="sylixosinput"
POINTERCAL_FILE="/etc/pointercal"
QT_PLUGIN_PATH="/qt/plugins"
QT_QWS_FONTDIR="/qt/lib/fonts"
QML_IMPORT_PATH="/qt/qml"
QML2_IMPORT_PATH="/qt/qml"
QT_QPA_PLATFORM_PLUGIN_PATH="/qt/plugins"
QT_QPA_PLATFORM="sylixosfb"
QT_QPA_FONTDIR="/qt/lib/fonts"
tetst="SylixOS kernel version: 2.1.6 Code name: Enterprise"
TERM_PS_COLOR=""
TERMCAP="/etc/termcap"
TERM="vt100"
LUA_CPATH="?.so;/usr/local/lib/lua/?.so;/usr/lib/lua/?.so;/lib/lua/?.so"
LUA_PATH="?.lua;/usr/local/lib/lua/?.lua;/usr/lib/lua/?.lua;/lib/lua/?.lua"
VPROC_MODULE_SHOW="0"
VPROC_EXIT_FORCE="0"
LOGINBL_REP="3"
LOGINBL_TO="120"
DEBUG_CRASHTRAP="0"
DEBUG_CPU="-1"
PATH_LOCALE="/usr/share/locale"
LC_ALL=""
LANG="C"
LD_LIBRARY_PATH="/qt/lib:/usr/lib:/lib:/usr/local/lib"
PATH="/usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin"
NFS_CLIENT_PROTO="udp"
NFS_CLIENT_AUTH="AUTH_UNIX"
SYSLOGD_HOST="0.0.0.0:514"
SO_MEM_DIRECT="0"
SO_MEM_PAGES="8192"
TSLIB_CALIBFILE="/etc/pointercal"
TSLIB_TSDEVICE="/dev/input/touch0"
MOUSE="/dev/input/touch0:/dev/input/mse0"
KEYBOARD="/dev/input/kbd0"
STARTUP_WAIT_SEC="1"
TZ="CST-8:00:00"
[root@sylixos:/root]#
vardel
命令用于删除一个系统环境变量。在 Shell 环境中可以直接引用环境变量的值,引用格式为
${VAR_NAME}
,大括号可省略。遇到此参数时 Shell 会自动使用环境变量的内容来替代${VAR_NAME}
。例如:执行echo ${PATH}
命令,系统将会回显 PATH 环境变量的内容。Shell 环境中无需特定命令,可以直接添加或修改某环境变量,格式为:
VAR_NAME=VAR_VALUE
。等号前后不能有空格,否则会被认为是某条命令加参数,而不是环境变量操作。 等号右边变量值可以为空,用于创建空值的环境变量或将某环境变量的值置为空,如果要删除某变量需要用vardel
命令。变量值间不能有空格,否则会被分割为多个字符串且只有第一个字符串有效,如果需要输入的内容确实要有空格则要用双引号全部括起来。修改一个环境变量,系统当前环境变量会立即变化,但不一定会立即起效,是否立即起效由具体使用环境变量的程序来决定,如TZ环境变量修改后,必须调用
tzsync
命令才会起效,而PATH变量则会立即起效,因为每次查找执行程序都会重新读取PATH变量值。修改一个环境变量,系统当前环境变量会立即变化,但这是临时的,复位后无效。需要环境变量一直有效可以在修改后调用
varsave
命令来保存修改,或者直接编辑/etc/profile
文件,下次重启起效。环境变量名和值有一定命名规范。环境变量名必须由大小写字母、数字或下换线组成,约定俗成是字母全大写。 变量值可以是任意可打印字符,或转移字符
\r
、\n
。变量值可以用双引号括起来,也可以不括。所有双引号括都会被忽略,如果变量值需要有双引号则需用转移字符\"
表示。[root@sylixos:/root]# echo ${PATH} /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# echo $PATH /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# TEST_PATH= [root@sylixos:/root]# echo $TEST_PATH sh: variable error. [root@sylixos:/root]# vars variable show >> VARIABLE REF VALUE -------------------- --- -------------------------------------------------- TEST_PATH NT_PROTO udp 。。。 [root@sylixos:/root]# vardel TEST_PATH [root@sylixos:/root]# echo $TEST_PATH sh: variable error. [root@sylixos:/root]# vars variable show >> VARIABLE REF VALUE -------------------- --- -------------------------------------------------- NT_PROTO udp DISPLAY /dev/fb0
[root@sylixos:/root]# [root@sylixos:/root]# TEST_PATH=$PATH [root@sylixos:/root]# echo $TEST_PATH /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# TEST_PATH=. [root@sylixos:/root]# echo $TEST_PATH . [root@sylixos:/root]# TEST_PATH=123 456 [root@sylixos:/root]# echo $TEST_PATH 123 [root@sylixos:/root]# TEST_PATH="123 456" [root@sylixos:/root]# echo $TEST_PATH 123 456 [root@sylixos:/root]# [root@sylixos:/root]# TEST_PATH="""123 456""" [root@sylixos:/root]# echo $TEST_PATH 123 456 [root@sylixos:/root]# TEST_PATH=""\"123 456\""" [root@sylixos:/root]# echo $TEST_PATH 123 [root@sylixos:/root]# TEST_PATH=""\"123\""" [root@sylixos:/root]# echo $TEST_PATH 123 [root@sylixos:/root]# TEST_PATH=123\n456 [root@sylixos:/root]# echo $TEST_PATH 123 456 [root@sylixos:/root]# TEST_PATH=123\\456 [root@sylixos:/root]# echo $TEST_PATH 123456 [root@sylixos:/root]#
[root@sylixos:/root]# args $PATH arg 1 is args arg 2 is /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# args ${PATH} arg 1 is args arg 2 is /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]#
双引号括起来的内容不进行环境变量替换。
[root@sylixos:/root]# echo $PATH /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# echo "$PATH" $PATH [root@sylixos:/root]#
Shell 下只能解析一层环境变量,不能递归解析多层环境变量。
[root@sylixos:/root]# VAR1=test [root@sylixos:/root]# VAR2="${VAR1}" [root@sylixos:/root]# vars variable show >> VARIABLE REF VALUE -------------------- --- -------------------------------------------------- VAR2 ${VAR1} VAR1 test TERM_PS_COLOR TERMCAP /etc/termcap TERM vt100 LUA_CPATH ?.so;/usr/local/lib/lua/?.so;/usr/lib/lua/?.so;/lib/lua/?.so LUA_PATH ?.lua;/usr/local/lib/lua/?.lua;/usr/lib/lua/?.lua;/lib/lua/?.lua VPROC_MODULE_SHOW 0 VPROC_EXIT_FORCE 0 LOGINBL_REP 3 LOGINBL_TO 120 DEBUG_CRASHTRAP 0 DEBUG_CPU -1 PATH_LOCALE /usr/share/locale LC_ALL LANG C LD_LIBRARY_PATH /usr/lib:/lib:/usr/local/lib PATH /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin NFS_CLIENT_PROTO udp NFS_CLIENT_AUTH AUTH_UNIX SYSLOGD_HOST 0.0.0.0:514 KERN_FLOAT 1 SO_MEM_DIRECT 0 SO_MEM_PAGES 8192 TSLIB_CALIBFILE /etc/pointercal TSLIB_TSDEVICE /dev/input/touch0 MOUSE /dev/input/mouse0:/dev/input/touch0 KEYBOARD /dev/input/keyboard0 STARTUP_WAIT_SEC 1 TZ CST-8:00:00 TMPDIR /tmp/ LICENSE SylixOS license: Commercial & GPL. VERSION 2.1.6 SYSTEM SylixOS kernel version: 2.1.6 Code name: Enterprise [root@sylixos:/root]# echo VAR1 VAR1 [root@sylixos:/root]# echo $VAR1 test [root@sylixos:/root]# echo $VAR2 ${VAR1} [root@sylixos:/root]#
当启动一个应用程序时,此份环境变量会导入到应用程序进程中,同时创建几个标示应用程序参数的环境变量,如
HOME
等。内核同时提供
env
应用程序,用于环境变量操作。env
应用程序不带参数时用于打印系统环境变量,只是输出格式和vars
命令不同。也可以带参数用于修改或增加环境变量,格式为env VAR_NAME=VAR_VALUE
,参数格式和单独进行环境变量设置一样,但效果略有不同,而且可以同时设置多组。设置时会显示设置前环境变量,需要再次查看才能看到新设置的效果。
[root@sylixos:/root]# env
TERM_PS_COLOR=
TERMCAP=/etc/termcap
TERM=vt100
LUA_CPATH=?.so;/usr/local/lib/lua/?.so;/usr/lib/lua/?.so;/lib/lua/?.so
LUA_PATH=?.lua;/usr/local/lib/lua/?.lua;/usr/lib/lua/?.lua;/lib/lua/?.lua
VPROC_MODULE_SHOW=0
VPROC_EXIT_FORCE=0
LOGINBL_REP=3
LOGINBL_TO=120
DEBUG_CRASHTRAP=0
DEBUG_CPU=-1
PATH_LOCALE=/usr/share/locale
LC_ALL=
LANG=C
LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib
PATH=/usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin
NFS_CLIENT_PROTO=udp
NFS_CLIENT_AUTH=AUTH_UNIX
SYSLOGD_HOST=0.0.0.0:514
KERN_FLOAT=1
SO_MEM_DIRECT=0
SO_MEM_PAGES=8192
TSLIB_CALIBFILE=/etc/pointercal
TSLIB_TSDEVICE=/dev/input/touch0
MOUSE=/dev/input/mouse0:/dev/input/touch0
KEYBOARD=/dev/input/keyboard0
STARTUP_WAIT_SEC=1
TZ=CST-8:00:00
TMPDIR=/tmp/
LICENSE=SylixOS license: Commercial & GPL.
VERSION=2.1.6
SYSTEM=SylixOS kernel version: 2.1.6 Code name: Enterprise
USER=root
HOME=/root
[root@sylixos:/root]#
[root@sylixos:/root]# env VAR_TEST1=123 VAR_TEST2=456
TERM_PS_COLOR=
TERMCAP=/etc/termcap
TERM=vt100
LUA_CPATH=?.so;/usr/local/lib/lua/?.so;/usr/lib/lua/?.so;/lib/lua/?.so
LUA_PATH=?.lua;/usr/local/lib/lua/?.lua;/usr/lib/lua/?.lua;/lib/lua/?.lua
VPROC_MODULE_SHOW=0
VPROC_EXIT_FORCE=0
LOGINBL_REP=3
LOGINBL_TO=120
DEBUG_CRASHTRAP=0
DEBUG_CPU=-1
PATH_LOCALE=/usr/share/locale
LC_ALL=
LANG=C
LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib
PATH=/usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin
NFS_CLIENT_PROTO=udp
NFS_CLIENT_AUTH=AUTH_UNIX
SYSLOGD_HOST=0.0.0.0:514
KERN_FLOAT=1
SO_MEM_DIRECT=0
SO_MEM_PAGES=8192
TSLIB_CALIBFILE=/etc/pointercal
TSLIB_TSDEVICE=/dev/input/touch0
MOUSE=/dev/input/mouse0:/dev/input/touch0
KEYBOARD=/dev/input/keyboard0
STARTUP_WAIT_SEC=1
TZ=CST-8:00:00
TMPDIR=/tmp/
LICENSE=SylixOS license: Commercial & GPL.
VERSION=2.1.6
SYSTEM=SylixOS kernel version: 2.1.6 Code name: Enterprise
USER=root
HOME=/root
[root@sylixos:/root]# env
VAR_TEST2=456
VAR_TEST1=123
TERM_PS_COLOR=
TERMCAP=/etc/termcap
TERM=vt100
LUA_CPATH=?.so;/usr/local/lib/lua/?.so;/usr/lib/lua/?.so;/lib/lua/?.so
LUA_PATH=?.lua;/usr/local/lib/lua/?.lua;/usr/lib/lua/?.lua;/lib/lua/?.lua
VPROC_MODULE_SHOW=0
VPROC_EXIT_FORCE=0
LOGINBL_REP=3
LOGINBL_TO=120
DEBUG_CRASHTRAP=0
DEBUG_CPU=-1
PATH_LOCALE=/usr/share/locale
LC_ALL=
LANG=C
LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib
PATH=/usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin
NFS_CLIENT_PROTO=udp
NFS_CLIENT_AUTH=AUTH_UNIX
SYSLOGD_HOST=0.0.0.0:514
KERN_FLOAT=1
SO_MEM_DIRECT=0
SO_MEM_PAGES=8192
TSLIB_CALIBFILE=/etc/pointercal
TSLIB_TSDEVICE=/dev/input/touch0
MOUSE=/dev/input/mouse0:/dev/input/touch0
KEYBOARD=/dev/input/keyboard0
STARTUP_WAIT_SEC=1
TZ=CST-8:00:00
TMPDIR=/tmp/
LICENSE=SylixOS license: Commercial & GPL.
VERSION=2.1.6
SYSTEM=SylixOS kernel version: 2.1.6 Code name: Enterprise
USER=root
HOME=/root
[root@sylixos:/root]#
- 其他情况,有一个系统提供的固定环境变量
?
,用于获得当前线程最后一次系统错误号。
[root@sylixos:/root]# echo $?
0
[root@sylixos:/root]# echo ${?}
0
[root@sylixos:/root]# /apps/cmdtest/cmdtest
cmdtest app
tid = 4010019
[sh]Warning: Program is killed (SIGKILL) by shell.
Restart SylixOS is recommended!
[root@sylixos:/root]# echo ${?}
1
[root@sylixos:/root]#