linux shell初探

    linux 操作系统的shell有很多种,比如bash shell,csh shell等等,最常用的是bash shell。shell是一个解释器,它将我们输入的命令逐个解释执行。

    当我们在终端提示符下输入命令时,这时会fork一个进程,父进程当然是shell程序/bin/sh,返回值大于0(子进程的PID),这是在父进程中执行,返回值为0.,在子进程中执行

 

   pid=fork();

  swith(pid)

{

case  -1 ;

perror('it is fault");

break;

case  0;

printf("in the child process pid=%d/n" getpid();

execv(.....);

break;

default:

printf("in the parent process");

break;

}

 

      子进程继承了父进程的环境(environment),调用exec函数并跳到相应的路径下去执行,当终端出现提示符时,子进程执行完毕。

 

比如;我们在终端输入su命令,按下enter键后,shell fork了一个子进程,由于子进程继承了父进程的执行环境,因此从shell的环境变量中

搜索su,发现在/sbin下,然后调用exec家族函数跳到/sbin下去执行su命令。

     注意,有的时候,我们输入的命令会出现command not found ,但是我们明明在我们的根目录下相关的文件夹找到了这个命令,这是因为问们的环境变量设置问题,可以在终端中输入printenv,会显示环境变量,我们输入的命令会在这个环境变量指定的目录下查找,如果没有就会输出上面的提示。此时我们可以修改环境变量,让其指向所有包含命令的目录即可。我们的shell是怎么提取这些命令来执行呢?

 

#include<stdio.h>
int main(int argc,char* argv[] )
{
        int i;
        for(i=0;i<argc;i++)
        {
        printf("agrv[%d] is %s/n",i,argv[i]);
        }
        return 0;
}
~
编译以后 gcc -o arg  arg.c

在终端中输入。./arg  arg1  arg2

会出现

argv[0]=./arg

argv[1]=arg1

argv[2]=arg2

 

不如我们输入命令 ls -r 

argv[0]=ls

argv[1]=r(过滤掉“-”符号)

 

说明:argc 是指输入参数的个数(包括命令ls),而argv则是输入参数的字符串指针数组,shell就是通过这种方式传递参数,执行相应的命令。

 

 

 

 

 

 

你可能感兴趣的:(linux,shell,command,gcc,bash,终端)