走进Linux的世界:命令行参数和环境变量
此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的。我们这个命令行参数这个操作就应用到了ls这些命令上,这些命令没有什么好神奇的就是一个可执行的二进制文件罢了,就运用到了ls加选项,很多指令都能加选项。相信大家见过这个main函数带参数的情况,这个参数就是命令行参数,前者代码参数的个数,后者则是内容。由此可以看出子进程能获取父进程的环境变量,环境变量是全局的本质
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的
passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let’s go!
我的博客:yuanManGan
我的专栏:C++入门小馆 C言雅韵集 数据结构漫游记 闲言碎语小记坊 进阶数据结构 走进Linux的世界 题山采玉 领略算法真谛

1. 命令行参数
1 #include <stdio.h>
2
3
4 int main(int argc, char *argv[])
5 {
6
7
8 return 0;
9 }
相信大家见过这个main函数带参数的情况,这个参数就是命令行参数,前者代码参数的个数,后者则是内容。
我们这样就能拿到argv数组
1 #include <stdio.h>
2
3
4 int main(int argc, char *argv[])
5 {
6 printf("argc = %d\n", argc);
7
8 int i = 0;
9 for(; i < argc; i++)
10 {
11 printf("argv[%d] = %s\n", i, argv[i]);
12 }
13
14 return 0;
15 }
编译运行后:
我们再后面加些东西试试

我们可以得出结论:
- 命令行参数至少是1,
argc >= 1, argc[0]一定不为空,且指向的元素是程序名! - 选项是以空格分隔开的字符串。
- 有
argc个,argv[argc - 1]是最后一个,argv[argc] = NULL。
我们的代码就可以变成这样:
1 #include <stdio.h>
2
3
4 int main(int argc, char *argv[])
5 {
6 printf("argc = %d\n", argc);
7
8 int i = 0;
9 for(; argv[i]; i++)
10 {
11 printf("argv[%d] = %s\n", i, argv[i]);
12 }
13
14 return 0;
15 }
我们这个命令行参数这个操作就应用到了ls这些命令上,这些命令没有什么好神奇的就是一个可执行的二进制文件罢了,就运用到了ls加选项,很多指令都能加选项。

2.环境变量
引出环境变量
我们在运行一个可执行文件的时候./mycommand,为什么直接mycommand不能运行必须要加./呢?
我们不加./系统会默认在/usr/bin/bash这个路径里找,那操作系统它自己怎么知道它应该去那个路径下找可执行程序呢?会不会还去其他路径下也找呢?
Linux下就存在一个叫环境变量的东西,比如一个PATH,这个PATH里面就是你直接输入比如ls它就会在PATH路径下去找
我们使用echo $环境变量 就能打印出该环境变量
我们也可以把当前路径加入到环境变量PATH中,这样就可以直接运行mycommand了。

我们也不用担心PATH,因为这是内存级的文件,重新进入shell时PATH会还原。
那我们的环境变量是从哪里来的呢?
答:父进程。
我们的程序和命令都是bash进程的子进程,子进程代码和数据可以共享。
获取环境变量
方法和命令行参数差不多:
1 #include<stdio.h>
2
3 int main(int argc, char* argv[], char* env[])
4 {
5 int i = 0;
6 for(; env[i]; i++)
7 {
8 printf("env[%d]: %s\n", i, env[i]);
9 }
10
11 return 0;
12 }

我们还可以通过getenv(name)的方式拿到环境变量。
printf("PATH = %s\n", getenv("PATH"));

本地变量,环境变量,内建命令
这个就是本地变量。
在环境变量里面没有本地变量
如果你想把本地变量写入环境变量可以export 本地变量

反之清楚环境变量用 unset 环境变量名
由此可以看出子进程能获取父进程的环境变量,环境变量是全局的本质:环境变量可以被子进程继承
反之本地变量无法被子进程继承!不具备全局性,只在bash内部可以访问
是不是所有的命令离开了环境变量就都失效了呢?

我们发现有些命令离开了环境变量后依旧有效,这说明:
命令和命令是不一样的
- 存在的二进制文件级别的命令:普通命令
- 内建命令:在
shell内部自己定义的,bash自己内部的一次函数调用。不依赖第三方路径。

更多推荐



所有评论(0)