目录1.命令行参数和环境变量1.1命令行参数以上跟我们平时的这些命令很像1.2 环境变量基本概念常见环境变量查看环境变量方法1.一个例子一个环境变量1. 要执行一个程序必须先找到它2. 系统中存在环境变量来帮助系统找到目标二进制文件2. 1》.如何理解环境变量存储的角度2》.环境变量最开始从哪里来的呢3.认识更多的环境变量4.获取环境变量的方法4.1操作4.2代码方法一 方法二 方法三5.理解环境变量的特性5.1 环境变量具有全局特性5.2 补充两个概念a.本地变量b.我们的环境变量是在bash里面1.命令行参数和环境变量1.1命令行参数main函数有参数吗有的[user1iZ5waahoxw3q2bZ 26-4-23]$ cat Makefile code:code.c gcc -o $ $^ -stdc99 .PHONY:clean clean: rm -f code [user1iZ5waahoxw3q2bZ 26-4-23]$ cat code.c #includestdio.h int main(int argc,char *argv[]) { for(int i 0 ; iargc;i) { printf(argv[%d]:%s\n,i,argv[i]); } return 0; }main函数只是我们编写的代码逻辑的入口而不是程序进程的第一个被调用的函数。严格意义上的第一个被调用的函数是启动例程中的某个函数如_start。[user1iZ5waahoxw3q2bZ 26-4-23]$ make gcc -o code code.c -stdc99 [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code argv[0]:./code [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code a argv[0]:./code argv[1]:a [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code a b c d argv[0]:./code argv[1]:a argv[2]:b argv[3]:c argv[4]:dargv就是一个变长的数组随着用户输入的依次传递出来。main函数的两个参数argc和argv用于接收命令行参数让你可以在程序启动时从外部传递数据。参数含义argcargument count整型表示命令行参数的总个数。至少为 1因为程序名本身也算一个参数。argvargument vector字符指针数组每个元素指向一个参数字符串。其中argv[0]指向程序的名称或路径。argv[1]指向第一个用户输入的参数。...argv[argc]是一个NULL指针作为结束标志。以上跟我们平时的这些命令很像[user1iZ5waahoxw3q2bZ 26-4-23]$ ls -a -b -c code . Makefile code.c .. [user1iZ5waahoxw3q2bZ 26-4-23]$ file /usr/bin/ls /usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]ceaf496f3aec08afced234f4f36330d3d13a657b, stripped[user1iZ5waahoxw3q2bZ 26-4-23]$ ./code Usage:./code [-a|-b|-c] [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code -a [user1iZ5waahoxw3q2bZ 26-4-23]$ cat code.c #includestdio.h int main(int argc,char *argv[]) { if(argc ! 2) { printf(Usage:%s [-a|-b|-c]\n,argv[0]); } return 0; }code.c[user1iZ5waahoxw3q2bZ 26-4-23]$ cat code.c #includestdio.h #includestring.h int main(int argc,char *argv[]) { if(argc ! 2) { printf(Usage:%s [-a|-b|-c]\n,argv[0]); return 1; } const char *arg argv[1]; if(strcmp(arg,-a) 0) printf(这是功能1\n); else if(strcmp(arg,-b) 0) printf(这是功能2\n); else if(strcmp(arg,-c) 0) printf(这是功能3\n); else printf(Usage:%s [-a|-b|-c]\n,argv[0]); return 0; }[user1iZ5waahoxw3q2bZ 26-4-23]$ make gcc -o code code.c -stdc99 [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code Usage:./code [-a|-b|-c] [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code -a 这是功能1 [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code -b 这是功能2 [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code -c 这是功能3main的命令行参数是实现程序不同子功能的方法--指令选项的实现原理bash帮你切分了进程拥有一张表argv表用来支持实现选项功能我们自己写的跟系统没有本质区别1.2 环境变量基本概念• 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数• 如我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪 里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。• 环境变量通常具有某些特殊用途还有在系统当中通常具有全局特性常见环境变量• PATH : 指定命令的搜索路径• HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)• SHELL : 当前Shell,它的值通常是/bin/bash。查看环境变量方法echo $NAME //NAME:你的环境变量名称1.一个例子一个环境变量1. 要执行一个程序必须先找到它bash找通过PATH来找环境变量把自己写的code添加到系统中这样就能直接执行了[user1iZ5waahoxw3q2bZ 26-4-23]$ sudo cp code /usr/bin/ [sudo] password for user1: [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code Usage:./code [-a|-b|-c] [user1iZ5waahoxw3q2bZ 26-4-23]$ code -a 这是功能1 [user1iZ5waahoxw3q2bZ 26-4-23]$ code -b 这是功能2[user1iZ5waahoxw3q2bZ 26-4-23]$ sudo rm /usr/bin/code [user1iZ5waahoxw3q2bZ 26-4-23]$ code -bash: /usr/bin/code: No such file or directory2. 系统中存在环境变量来帮助系统找到目标二进制文件环境变量PATH ----告诉系统在哪些路径下找---系统中搜索指令的默认搜索路径!/usr/bin目录下默认找到env--查看所有环境变量名称内容echo $xxx --- 获得任意一个环境变量的内容[user1iZ5waahoxw3q2bZ 26-4-23]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin发现上面这些路径之间有带冒号比如执行一个ls命令时不是默认在usr/bin路径下是默认查环境变量而查环境变量时默认以冒号做分割符在第一个路径下找如果没有找到ls那么就在下一个路径下找以此类推。如果都没有找到报command not found。找到了就加载并执行。所以我们如果直接把自己的路径添加到环境变量里面同样也可以直接执行。[user1iZ5waahoxw3q2bZ 26-4-23]$ pwd /home/user1/linux-learning/linux/26-4-23 [user1iZ5waahoxw3q2bZ 26-4-23]$ [user1iZ5waahoxw3q2bZ 26-4-23]$ PATH/home/user1/linux-learning/linux/26-4-23 [user1iZ5waahoxw3q2bZ 26-4-23]$ code -a 这是功能1可是发现之后很多命令都执行不了系统命令找不到了[user1iZ5waahoxw3q2bZ 26-4-23]$ ls -bash: ls: command not found [user1iZ5waahoxw3q2bZ 26-4-23]$ mkdir -bash: mkdir: command not found发现如果直接去进行赋值覆盖PATH的内容了[user1iZ5waahoxw3q2bZ 26-4-23]$ echo $PATH /home/user1/linux-learning/linux/26-4-23恢复1.可以直接关掉终端重进。2.或者重新添加之前原本的这样才是正确的添加[user1iZ5waahoxw3q2bZ 26-4-23]$ PATH$PATH:/home/user1/linux-learning/linux/26-4-23 [user1iZ5waahoxw3q2bZ 26-4-23]$ code -a 这是功能1 [user1iZ5waahoxw3q2bZ 26-4-23]$ ls code code.c Makefile [user1iZ5waahoxw3q2bZ 26-4-23]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin:/home/user1/linux-learning/linux/26-4-232.1》.如何理解环境变量存储的角度--bash 形成一张表环境变量表---指针数组的样子ls -a -b ---bash先拿到--构造当前命令行参数表解析出来然后拿着这个命令再在环境变量表里面找到PATH由PATH在系统中找对应命令是否存在在就创建子进程执行bash内部有两张表一张命令行参数表一张环境变量表2》.环境变量最开始从哪里来的呢环境变量是从 系统的相关配置文件中来的如果把我们的code添加到这个.bashrc里即便关掉终端重开也可行Welcome to Alibaba Cloud Elastic Compute Service ! [user1iZ5waahoxw3q2bZ ~]$ code Usage:code [-a|-b|-c] [user1iZ5waahoxw3q2bZ ~]$ code -a 这是功能1最后如果linux系统有10个用户登陆存在10个bash指令的查找工作是由bash自己执行的3.认识更多的环境变量1.HOME[user1iZ5waahoxw3q2bZ ~]$ echo $HOME /home/user1HOME环境变量--当前用户的家目录2.SHELL[user1iZ5waahoxw3q2bZ ~]$ echo $SHELL /bin/bash当前Shell,它的值通常是/bin/bash。表示当前用的哪个版本的shell3.USER[user1iZ5waahoxw3q2bZ ~]$ echo $USER user1当前用户是谁4.HISTSIZE[user1iZ5waahoxw3q2bZ ~]$ echo $HISTSIZE 1000HISTSIZE历史命令大小5.HOSTNAME[user1iZ5waahoxw3q2bZ ~]$ echo $HOSTNAME iZ5waahoxw3q2bZHOSTNAME当前用户的主机名6.PWD/OLDPWD[user1iZ5waahoxw3q2bZ ~]$ echo $PWD /home/user1 [user1iZ5waahoxw3q2bZ ~]$ echo $OLDPWD[user1iZ5waahoxw3q2bZ ~]$ cd linux-learning [user1iZ5waahoxw3q2bZ linux-learning]$ echo $OLDPWD /home/user1 [user1iZ5waahoxw3q2bZ linux-learning]$ cd linux [user1iZ5waahoxw3q2bZ linux]$ echo $OLDPWD /home/user1/linux-learning [user1iZ5waahoxw3q2bZ linux]$ cd 26-4-23 [user1iZ5waahoxw3q2bZ 26-4-23]$ echo $OLDPWD /home/user1/linux-learning/linuxOLDPWD存储了上一个工作目录的路径4.获取环境变量的方法4.1操作导入一个环境变量[user1iZ5waahoxw3q2bZ 26-4-23]$ export MYENV111223344取消一个环境变量[user1iZ5waahoxw3q2bZ 26-4-23]$ unset MYENV空了就是没了[user1iZ5waahoxw3q2bZ 26-4-23]$ echo $MYENV查看环境变量 env[user1iZ5waahoxw3q2bZ 26-4-23]$ envmain函数有参数吗有最多可以有几个3个对应的argc跟argv是父进程传递的int main(int argc,char *argv[],char *env[])4.2代码方法一获取环境变量--父进程的bash---环境变量可以被子进程继承--子进程可以进行个性化操作所以说环境变量在系统当中通常具有全局特性系统在执行的时候是_start函数不是main函数_start{int ret0;int arg_count0;arg_count3;if(arg_count0)retmain();else if(arg_count2)retmain(argc,argv);elseretmain(argc,argv,env);}[user1iZ5waahoxw3q2bZ 26-4-23]$ cat code.c #includestdio.h #includestring.h int main(int argc,char *argv[],char *env[]) { (void)argc; (void)argv; for(int i0;env[i];i) { printf(env[%d]- %s\n,i,env[i]); } return 0; }拿到了环境变量[user1iZ5waahoxw3q2bZ 26-4-23]$ ./code env[0]- XDG_SESSION_ID2074 env[1]- HOSTNAMEiZ5waahoxw3q2bZ env[2]- TERMxterm env[3]- SHELL/bin/bash env[4]- HISTSIZE1000 env[5]- SSH_CLIENT180.110.148.56 61298 22 env[6]- SSH_TTY/dev/pts/0 env[7]- USERuser1 env[8]- LS_COLORSrs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40;33;01:cd40;33;01:or40;31;01:mi01;05;37;41:su37;41:sg30;43:ca30;41:tw30;42:ow34;42:st37;44:ex01;32:*.tar01;31:*.tgz01;31:*.arc01;31:*.arj01;31:*.taz01;31:*.lha01;31:*.lz401;31:*.lzh01;31:*.lzma01;31:*.tlz01;31:*.txz01;31:*.tzo01;31:*.t7z01;31:*.zip01;31:*.z01;31:*.Z01;31:*.dz01;31:*.gz01;31:*.lrz01;31:*.lz01;31:*.lzo01;31:*.xz01;31:*.bz201;31:*.bz01;31:*.tbz01;31:*.tbz201;31:*.tz01;31:*.deb01;31:*.rpm01;31:*.jar01;31:*.war01;31:*.ear01;31:*.sar01;31:*.rar01;31:*.alz01;31:*.ace01;31:*.zoo01;31:*.cpio01;31:*.7z01;31:*.rz01;31:*.cab01;31:*.jpg01;35:*.jpeg01;35:*.gif01;35:*.bmp01;35:*.pbm01;35:*.pgm01;35:*.ppm01;35:*.tga01;35:*.xbm01;35:*.xpm01;35:*.tif01;35:*.tiff01;35:*.png01;35:*.svg01;35:*.svgz01;35:*.mng01;35:*.pcx01;35:*.mov01;35:*.mpg01;35:*.mpeg01;35:*.m2v01;35:*.mkv01;35:*.webm01;35:*.ogm01;35:*.mp401;35:*.m4v01;35:*.mp4v01;35:*.vob01;35:*.qt01;35:*.nuv01;35:*.wmv01;35:*.asf01;35:*.rm01;35:*.rmvb01;35:*.flc01;35:*.avi01;35:*.fli01;35:*.flv01;35:*.gl01;35:*.dl01;35:*.xcf01;35:*.xwd01;35:*.yuv01;35:*.cgm01;35:*.emf01;35:*.axv01;35:*.anx01;35:*.ogv01;35:*.ogx01;35:*.aac01;36:*.au01;36:*.flac01;36:*.mid01;36:*.midi01;36:*.mka01;36:*.mp301;36:*.mpc01;36:*.ogg01;36:*.ra01;36:*.wav01;36:*.axa01;36:*.oga01;36:*.spx01;36:*.xspf01;36: env[9]- MAIL/var/spool/mail/user1 env[10]- PATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin env[11]- PWD/home/user1/linux-learning/linux/26-4-23 env[12]- LANGen_US.UTF-8 env[13]- HISTCONTROLignoredups env[14]- SHLVL1 env[15]- HOME/home/user1 env[16]- LOGNAMEuser1 env[17]- SSH_CONNECTION180.110.148.56 61298 172.26.47.134 22 env[18]- LESSOPEN||/usr/bin/lesspipe.sh %s env[19]- XDG_RUNTIME_DIR/run/user/1001 env[20]- _./code env[21]- OLDPWD/home/user1/linux-learning/linuxenv参数与argv结构类似指针数组以 NULL 结尾但语义不同环境变量 vs 命令行参数。它提供了一个方便的方式让程序获取系统环境配置无需调用getenv也能遍历所有变量。环境变量通常遵循键值格式修改时需注意不要破坏后续getenv的使用。现代 C 程序中也可以使用extern char **environ来代替main的第三个参数更符合 POSIX 标准。编译器在编译的时候对main函数的几个参数进行扫描然后在它的_start函数里进行判断我们自己导的环境变量可以被子进程拿到----环境变量可以被子进程继承[user1iZ5waahoxw3q2bZ 26-4-23]$ export MYENV11111 [user1iZ5waahoxw3q2bZ 26-4-23]$ export MYENV22222 [user1iZ5waahoxw3q2bZ 26-4-23]$ export MYENV33333 [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code env[0]- XDG_SESSION_ID2074 env[1]- HOSTNAMEiZ5waahoxw3q2bZ env[2]- TERMxterm env[3]- SHELL/bin/bash env[4]- HISTSIZE1000 env[5]- SSH_CLIENT180.110.148.56 61298 22 env[6]- OLDPWD/home/user1/linux-learning/linux env[7]- SSH_TTY/dev/pts/0 env[8]- USERuser1 env[9]- LS_COLORSrs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40;33;01:cd40;33;01:or40;31;01:mi01;05;37;41:su37;41:sg30;43:ca30;41:tw30;42:ow34;42:st37;44:ex01;32:*.tar01;31:*.tgz01;31:*.arc01;31:*.arj01;31:*.taz01;31:*.lha01;31:*.lz401;31:*.lzh01;31:*.lzma01;31:*.tlz01;31:*.txz01;31:*.tzo01;31:*.t7z01;31:*.zip01;31:*.z01;31:*.Z01;31:*.dz01;31:*.gz01;31:*.lrz01;31:*.lz01;31:*.lzo01;31:*.xz01;31:*.bz201;31:*.bz01;31:*.tbz01;31:*.tbz201;31:*.tz01;31:*.deb01;31:*.rpm01;31:*.jar01;31:*.war01;31:*.ear01;31:*.sar01;31:*.rar01;31:*.alz01;31:*.ace01;31:*.zoo01;31:*.cpio01;31:*.7z01;31:*.rz01;31:*.cab01;31:*.jpg01;35:*.jpeg01;35:*.gif01;35:*.bmp01;35:*.pbm01;35:*.pgm01;35:*.ppm01;35:*.tga01;35:*.xbm01;35:*.xpm01;35:*.tif01;35:*.tiff01;35:*.png01;35:*.svg01;35:*.svgz01;35:*.mng01;35:*.pcx01;35:*.mov01;35:*.mpg01;35:*.mpeg01;35:*.m2v01;35:*.mkv01;35:*.webm01;35:*.ogm01;35:*.mp401;35:*.m4v01;35:*.mp4v01;35:*.vob01;35:*.qt01;35:*.nuv01;35:*.wmv01;35:*.asf01;35:*.rm01;35:*.rmvb01;35:*.flc01;35:*.avi01;35:*.fli01;35:*.flv01;35:*.gl01;35:*.dl01;35:*.xcf01;35:*.xwd01;35:*.yuv01;35:*.cgm01;35:*.emf01;35:*.axv01;35:*.anx01;35:*.ogv01;35:*.ogx01;35:*.aac01;36:*.au01;36:*.flac01;36:*.mid01;36:*.midi01;36:*.mka01;36:*.mp301;36:*.mpc01;36:*.ogg01;36:*.ra01;36:*.wav01;36:*.axa01;36:*.oga01;36:*.spx01;36:*.xspf01;36: env[10]- MAIL/var/spool/mail/user1 env[11]- PATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin env[12]- PWD/home/user1/linux-learning/linux/26-4-23 env[13]- LANGen_US.UTF-8 env[14]- HISTCONTROLignoredups env[15]- SHLVL1 env[16]- HOME/home/user1 env[17]- LOGNAMEuser1 env[18]- SSH_CONNECTION180.110.148.56 61298 172.26.47.134 22 env[19]- LESSOPEN||/usr/bin/lesspipe.sh %s env[20]- XDG_RUNTIME_DIR/run/user/1001 env[21]- MYENV11111 env[22]- MYENV33333 env[23]- MYENV22222 env[24]- _./code环境变量在系统当中通常具有全局特性为什么方法二getenv 根据环境变量的名字获取内容NAME getenv, secure_getenv - get an environment variable SYNOPSIS #include stdlib.h char *getenv(const char *name); char *secure_getenv(const char *name); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): secure_getenv(): _GNU_SOURCEsetenvNAME setenv - change or add an environment variable SYNOPSIS #include stdlib.h int setenv(const char *name, const char *value, int overwrite); int unsetenv(const char *name); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): setenv(), unsetenv(): _BSD_SOURCE || _POSIX_C_SOURCE 200112L || _XOPEN_SOURCE 600[user1iZ5waahoxw3q2bZ 26-4-23]$ cat code.c #includestdio.h #includestring.h #includestdlib.h int main(int argc,char *argv[],char *env[]) { (void)argc; (void)argv; (void)env; char *value getenv(PATH);//获取PATH这个环境变量 if(valueNULL)return 1; printf(PATH-%s\n,value); return 0; }[user1iZ5waahoxw3q2bZ 26-4-23]$ make gcc -o code code.c -stdc99 [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code PATH-/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin如果想写一个程序只能由我执行其他人一律不能执行只有bash知道当前登陆的是谁。[user1iZ5waahoxw3q2bZ 26-4-23]$ cat code.c #includestdio.h #includestring.h #includestdlib.h int main(int argc,char *argv[],char *env[]) { (void)argc; (void)argv; (void)env; const char *who getenv(USER); if(who NULL) return 1; if(strcmp(who,user1)0) { printf(这是程序的正常逻辑!\n); } else { printf(Only user1!!\n); } return 0; }用user1[user1iZ5waahoxw3q2bZ 26-4-23]$ make gcc -o code code.c -stdc99 [user1iZ5waahoxw3q2bZ 26-4-23]$ whoami user1 [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code 这是程序的正常逻辑!用root[rootiZ5waahoxw3q2bZ ~]# cd /home/user1/linux-learning/linux/26-4-23 [rootiZ5waahoxw3q2bZ 26-4-23]# whoami root [rootiZ5waahoxw3q2bZ 26-4-23]# ./code Only user1!!子进程可以进行个性化操作方法三environNAME environ, execl, execv, execle, execve, execlp, execvp - execute a file SYNOPSIS #include unistd.h extern char **environ; int execl(const char *path, const char *arg0, ... /*, (char *)0 */); int execv(const char *path, char *const argv[]); int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp[]*/); int execve(const char *path, char *const argv[], char *const envp[]); int execlp(const char *file, const char *arg0, ... /*, (char *)0 */); int execvp(const char *file, char *const argv[]);extern char **environ;因为环境变量表时char*的[user1iZ5waahoxw3q2bZ 26-4-23]$ cat code.c #includestdio.h #includestring.h #includestdlib.h #includeunistd.h extern char **environ; int main(int argc,char *argv[]) { (void)argc; (void)argv; for(int i0;environ[i];i) { printf(environ[%d]-%s\n,i,environ[i]); } return 0; }结果[user1iZ5waahoxw3q2bZ 26-4-23]$ make gcc -o code code.c -stdc99 [user1iZ5waahoxw3q2bZ 26-4-23]$ ./code environ[0]-XDG_SESSION_ID2074 environ[1]-HOSTNAMEiZ5waahoxw3q2bZ environ[2]-TERMxterm environ[3]-SHELL/bin/bash environ[4]-HISTSIZE1000 environ[5]-SSH_CLIENT180.110.148.56 61298 22 environ[6]-OLDPWD/home/user1/linux-learning/linux environ[7]-SSH_TTY/dev/pts/0 environ[8]-USERuser1 environ[9]-LS_COLORSrs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40;33;01:cd40;33;01:or40;31;01:mi01;05;37;41:su37;41:sg30;43:ca30;41:tw30;42:ow34;42:st37;44:ex01;32:*.tar01;31:*.tgz01;31:*.arc01;31:*.arj01;31:*.taz01;31:*.lha01;31:*.lz401;31:*.lzh01;31:*.lzma01;31:*.tlz01;31:*.txz01;31:*.tzo01;31:*.t7z01;31:*.zip01;31:*.z01;31:*.Z01;31:*.dz01;31:*.gz01;31:*.lrz01;31:*.lz01;31:*.lzo01;31:*.xz01;31:*.bz201;31:*.bz01;31:*.tbz01;31:*.tbz201;31:*.tz01;31:*.deb01;31:*.rpm01;31:*.jar01;31:*.war01;31:*.ear01;31:*.sar01;31:*.rar01;31:*.alz01;31:*.ace01;31:*.zoo01;31:*.cpio01;31:*.7z01;31:*.rz01;31:*.cab01;31:*.jpg01;35:*.jpeg01;35:*.gif01;35:*.bmp01;35:*.pbm01;35:*.pgm01;35:*.ppm01;35:*.tga01;35:*.xbm01;35:*.xpm01;35:*.tif01;35:*.tiff01;35:*.png01;35:*.svg01;35:*.svgz01;35:*.mng01;35:*.pcx01;35:*.mov01;35:*.mpg01;35:*.mpeg01;35:*.m2v01;35:*.mkv01;35:*.webm01;35:*.ogm01;35:*.mp401;35:*.m4v01;35:*.mp4v01;35:*.vob01;35:*.qt01;35:*.nuv01;35:*.wmv01;35:*.asf01;35:*.rm01;35:*.rmvb01;35:*.flc01;35:*.avi01;35:*.fli01;35:*.flv01;35:*.gl01;35:*.dl01;35:*.xcf01;35:*.xwd01;35:*.yuv01;35:*.cgm01;35:*.emf01;35:*.axv01;35:*.anx01;35:*.ogv01;35:*.ogx01;35:*.aac01;36:*.au01;36:*.flac01;36:*.mid01;36:*.midi01;36:*.mka01;36:*.mp301;36:*.mpc01;36:*.ogg01;36:*.ra01;36:*.wav01;36:*.axa01;36:*.oga01;36:*.spx01;36:*.xspf01;36: environ[10]-MAIL/var/spool/mail/user1 environ[11]-PATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin environ[12]-PWD/home/user1/linux-learning/linux/26-4-23 environ[13]-LANGen_US.UTF-8 environ[14]-HISTCONTROLignoredups environ[15]-SHLVL1 environ[16]-HOME/home/user1 environ[17]-LOGNAMEuser1 environ[18]-SSH_CONNECTION180.110.148.56 61298 172.26.47.134 22 environ[19]-LESSOPEN||/usr/bin/lesspipe.sh %s environ[20]-XDG_RUNTIME_DIR/run/user/1001 environ[21]-MYENV11111 environ[22]-MYENV33333 environ[23]-MYENV22222 environ[24]-_./code5.理解环境变量的特性5.1 环境变量具有全局特性5.2 补充两个概念a.本地变量[user1iZ5waahoxw3q2bZ 26-4-23]$ i10 [user1iZ5waahoxw3q2bZ 26-4-23]$ echo $i 10在命令行中定义本地变量发现在env中查不到这个可以通过set查到所有本地变量set会显示环境变量和本地变量bash会记录两套变量1.环境 2.本地本地变量---不会被子进程继承只在bash内部被使用有些本地变量有特殊用途[user1iZ5waahoxw3q2bZ 26-4-23]$ set BASH/bin/bash BASHOPTScheckwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES() BASH_ARGC() BASH_ARGV() BASH_CMDS() BASH_LINENO() BASH_SOURCE() BASH_VERSINFO([0]4 [1]2 [2]46 [3]2 [4]release [5]x86_64-redhat-linux-gnu) BASH_VERSION4.2.46(2)-release COLUMNS102 DIRSTACK() EUID1001 GROUPS() HISTCONTROLignoredups HISTFILE/home/user1/.bash_history HISTFILESIZE1000 HISTSIZE1000 HOME/home/user1 HOSTNAMEiZ5waahoxw3q2bZ HOSTTYPEx86_64 ID1001 IFS$ \t\n LANGen_US.UTF-8 LESSOPEN||/usr/bin/lesspipe.sh %s LINES35 LOGNAMEuser1 LS_COLORSrs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40;33;01:cd40;33;01:or40;31;01:mi01;05;37;41:su37;41:sg30;43:ca30;41:tw30;42:ow34;42:st37;44:ex01;32:*.tar01;31:*.tgz01;31:*.arc01;31:*.arj01;31:*.taz01;31:*.lha01;31:*.lz401;31:*.lzh01;31:*.lzma01;31:*.tlz01;31:*.txz01;31:*.tzo01;31:*.t7z01;31:*.zip01;31:*.z01;31:*.Z01;31:*.dz01;31:*.gz01;31:*.lrz01;31:*.lz01;31:*.lzo01;31:*.xz01;31:*.bz201;31:*.bz01;31:*.tbz01;31:*.tbz201;31:*.tz01;31:*.deb01;31:*.rpm01;31:*.jar01;31:*.war01;31:*.ear01;31:*.sar01;31:*.rar01;31:*.alz01;31:*.ace01;31:*.zoo01;31:*.cpio01;31:*.7z01;31:*.rz01;31:*.cab01;31:*.jpg01;35:*.jpeg01;35:*.gif01;35:*.bmp01;35:*.pbm01;35:*.pgm01;35:*.ppm01;35:*.tga01;35:*.xbm01;35:*.xpm01;35:*.tif01;35:*.tiff01;35:*.png01;35:*.svg01;35:*.svgz01;35:*.mng01;35:*.pcx01;35:*.mov01;35:*.mpg01;35:*.mpeg01;35:*.m2v01;35:*.mkv01;35:*.webm01;35:*.ogm01;35:*.mp401;35:*.m4v01;35:*.mp4v01;35:*.vob01;35:*.qt01;35:*.nuv01;35:*.wmv01;35:*.asf01;35:*.rm01;35:*.rmvb01;35:*.flc01;35:*.avi01;35:*.fli01;35:*.flv01;35:*.gl01;35:*.dl01;35:*.xcf01;35:*.xwd01;35:*.yuv01;35:*.cgm01;35:*.emf01;35:*.axv01;35:*.anx01;35:*.ogv01;35:*.ogx01;35:*.aac01;36:*.au01;36:*.flac01;36:*.mid01;36:*.midi01;36:*.mka01;36:*.mp301;36:*.mpc01;36:*.ogg01;36:*.ra01;36:*.wav01;36:*.axa01;36:*.oga01;36:*.spx01;36:*.xspf01;36: MACHTYPEx86_64-redhat-linux-gnu MAIL/var/spool/mail/user1 MAILCHECK60 MYENV11111 MYENV22222 MYENV33333 OLDPWD/home/user1/linux-learning/linux OPTERR1 OPTIND1 OSTYPElinux-gnu PATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin PIPESTATUS([0]0) PPID26908 PROMPT_COMMANDprintf \033]0;%s%s:%s\007 ${USER} ${HOSTNAME%%.*} ${PWD/#$HOME/~} PS1[\u\h \W]\$ PS2 PS4 PWD/home/user1/linux-learning/linux/26-4-23 SHELL/bin/bash SHELLOPTSbraceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL1 SSH_CLIENT180.110.148.56 61298 22 SSH_CONNECTION180.110.148.56 61298 172.26.47.134 22 SSH_TTY/dev/pts/0 TERMxterm UID1001 USERuser1 XDG_RUNTIME_DIR/run/user/1001 XDG_SESSION_ID2074 _10 colors/home/user1/.dircolors i10比如这个PS1[\u\h \W]\$ 是用来定义命令行提示符显示格式的环境变量是显示命令行格式也就是[user1iZ5waahoxw3q2bZ 26-4-23]$b.我们的环境变量是在bash里面export --- 内建命令 bulit-in command ---这个命令执行时不需要创建子进程而是让bash自己亲自执行---bash自己调用函数或者系统调用完成的感谢你的观看期待我们下次再见