命令行参数和环境变量
目录
- 命令行参数
- 环境变量
命令行参数
main函数的参数可带可不带
可带:这些参数的意义:int argc, char *argv[]
1 #include <stdio.h>
2 #include <unistd.h>
3
4 int main(int argc, char *argv[])
5 {
6 int i;
7 for(i = 0; i < argc; i++)
8 {
9 printf("argv[%d] -> %s\n", i, argv[i]);
10 }
11 }
[tt@kunkun state]$ ./myprocess
argv[0] -> ./myprocess
[tt@kunkun state]$ ./myprocess -a
argv[0] -> ./myprocess
argv[1] -> -a
[tt@kunkun state]$ ./myprocess -a -b
^[[Aargv[0] -> ./myprocess
argv[1] -> -a
argv[2] -> -b
[tt@kunkun state]$ ./myprocess -a -b -c
argv[0] -> ./myprocess
argv[1] -> -a
argv[2] -> -b
argv[3] -> -c
[tt@kunkun state]$ ./myprocess -a -b -c -d
argv[0] -> ./myprocess
argv[1] -> -a
argv[2] -> -b
argv[3] -> -c
argv[4] -> -d
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <string.h>
4 int main(int argc, char *argv[])
5 {
6 if(argc != 2)
7 {
8 printf("Usage: %s -[a,b,c,d]\n", argv[0]);
9 return 1;
10 }
11
12 if(strcmp(argv[1], "-a") == 0)
13 {
14 printf("this is function1\n");
15 }
16 else if(strcmp(argv[1], "-b") == 0)
17 {
18 printf("this is function2\n");
19 }
20 else if(strcmp(argv[1], "-c") == 0)
21 {
22 printf("this is function3\n");
23 }
24 else if(strcmp(argv[1], "-d") == 0)
25 {
26 printf("this is function4\n");
27 }
28 else
29 {
30 printf("no this function!\n");
31 }
32}
[tt@kunkun state]$ ./myprocess
Usage: ./myprocess -[a,b,c,d]
[tt@kunkun state]$ ./myprocess -a
this is function1
[tt@kunkun state]$ ./myprocess -b
this is function2
[tt@kunkun state]$ ./myprocess -c
this is function3
[tt@kunkun state]$ ./myprocess -d
this is function4
[tt@kunkun state]$ ./myprocess -e
no this function!
为什么要有命令行参数:
本质:命令行参数本质是交给我们程序的不同的选型,用来定制不同的程序功能。命令行中会携带很多的选项。
父进程的,默认能被子进程看到并访问
命令行中启动的程序,都会变成进程,其实都是bash的子进程
父进程bash做的命令行参数的传递
环境变量
Linux中,存在一些全局的设置,表明告诉命令行解释器,应该去那些路径下去寻找可执行程序
[tt@kunkun ~]$ /usr/bin/ls -l --color
total 16
drwxrwxr-x 4 tt tt 4096 Feb 6 21:16 code
-rw-rw-r-- 1 tt tt 0 Jan 21 21:15 code.c
drwxrwxr-x 2 tt tt 4096 Jan 22 15:48 gdb
-rw-rw-r-- 1 tt tt 827 Jan 20 22:03 install.sh
drwxrwxr-x 3 tt tt 4096 Jan 21 21:07 test
[tt@kunkun ~]$ cd /usr/bin
[tt@kunkun bin]$ ./ls -l
PATH:环境变量
echo $PATH:打印环境变量的内容
系统中很多的配置,在我们登录Linux系统的时候,已经被加载到bash进程中
bash在执行命令的时候,需要先找到命令,因为未来要加载
[tt@kunkun ev]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/tt/.local/bin:/home/tt/bin
不能直接给环境变量赋值,相当于全部更改
但重启由于系统设置会重置
默认我们查到的环境变量是内存级的
[tt@kunkun ev]$ pwd
/home/tt/code/ev
[tt@kunkun ev]$ PATH=/home/tt/code/ev
该怎么做呢
但是依旧是内存级的
[tt@kunkun ev]$ PATH=$PATH:/home/tt/code/ev
[tt@kunkun ev]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/tt/.local/bin:/home/tt/bin:/home/tt/code/ev
最开始的环境变量不是在内存中,而是在系统的对应的配置文件中
环境变量默认是在配置文件中的
[tt@kunkun ~]$ vim .bash_profile
[tt@kunkun ~]$ vim .bashrc
[tt@kunkun ~]$ vim /etc/bashrc
env查看所有环境变量
[tt@kunkun ~]$ echo $HOME
/home/tt
[tt@kunkun ~]$ echo $PWD
/home/tt
[tt@kunkun ~]$ echo $SHELL
/bin/bash
[tt@kunkun ~]$ echo $HISTSIZE
1000
[tt@kunkun ~]$ history | head
1 pwd
2 su - tt
3 exit
4 pwd
5 yum -y update
6 yum -y install tree
7 su root
8 curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
9 ll
10 sudo yum install -y gcc-c++
自己导环境变量
内存级
[tt@kunkun ~]$ export THIS_IS_MY_ENV=hellott
[tt@kunkun ~]$ env | grep hellott
THIS_IS_MY_ENV=hellott
[tt@kunkun ~]$ unset THIS_IS_MY_ENV
[tt@kunkun ~]$ env | grep hellott
本地变量
[tt@kunkun ~]$ hello=123456
[tt@kunkun ~]$ env | grep hello
[tt@kunkun ~]$ echo $hello
123456
环境变量默认也是可以被子进程拿到的。环境变量们,默认在bash内部
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4
5 int main()
6 {
7 extern char **environ;
8 int i;
9 for(i = 0; environ[i]; i++)
10 {
11 printf("env[%d]->%s\n", i, environ[i]);
12 }
13 }
bash进程启动的时候 ,默认会给我们的子进程形成两张表:
argv[]命令行参数表、env[]环境变量表。bash通过各种方式交给子进程。
用户输入的命令行、从OS的配置文件来
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4
5 int main(int argc, char *argv[], char *env[])
6 {
7 int i;
8 for(i = 0; env[i]; i++)
9 {
10 printf("env[%d]->%s\n", i, env[i]);
11 }
12}
环境变量具有系统级的全局属性,因为环境变量本身会被子进程继承下去
本地变量只在本bash内部有效,无法被子进程继承下去
导成环境变量,此时才能够被获取