
正文
linux命令解释器原理 linux中命令解释器是
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Linux Shell是什么?
Shell,英文本意是外壳,Linux Shell 就是 Linux 操作系统的外壳,为用户提供使用操作系统的接口,是 Linux 系统用户交互的重要接口。登录 Linux 系统或者打开 Linux 的终端,都将会启动 Linux 所使用的 Shell。
Linux Shell 一个命令解释器,是 Linux 下最重要的交互界面,从标准输入接收用户命令,将命令进行解析并传递给内核,内核则根据命令,作出相应的动作,如果有反馈信息,则输出到标准输出上,示意过程如下图所示。嵌入式 Linux 的标准输入和输出都是串口终端。你可以去看一下M283-ARM9核心板
相关问答
Q1: 【Linux】实现一个简单的shell命令解释器
姓名:罗学元 学号:21181214375 学院:广州研究院
【嵌牛导读】shell命令解释器该包含哪些部分
【嵌牛鼻子】shell命令解释器该包含哪些部分
【嵌牛提问】shell命令解释器该包含哪些部分
我们所做的这个简单的shell命令解释器可以实现简单的常用的基本命令,如ls、pwd、cd、cd - 、cd ~ 等
根据简单命令的定义,它的第一个参数是要执行的命令,后面的参数作为该命令的参数。
要执行的命令有两种情况:
一种是外部命令: 也就是对应着磁盘上的某个程序,例如 pwd、ls等等。对于这种外部命令,我们首先要到指定的路径下找到它,然后再执行它。
另一种是内部命令:内部命令并不对应磁盘上的程序,例如cd等等,它需要shell自己来决定该如何执行。例如对 cd 命令,shell就应该根据它后面的参数改变当前路径。
对于外部命令,需要创建一个子进程来执行它,本质就是fork+exec
#include stdio.h
#include stdlib.h
#include assert.h
#include string.h
#include pwd.h
#include sys/utsname.h
#include sys/types.h
#include unistd.h
#define MAX 10
#define STRLEN 128
#define PATH "/bin/" //系统bin路径位置
char OLDPWD[STRLEN]={0}; //记录上一次的命令,为了cd -这条命令
//================================================================================
//每次敲回车输出当前所在用户信息
//普通用户和root用户的提示符区别
void Printf_Info()
{
char flag='$';
struct passwd *pw=getpwuid(getuid());
assert(pw!=NULL);
//uid为0则为root用户
if(pw-pw_uid==0)
{
flag='#';
}
struct utsname hostname; //主机名
uname(hostname);
char node[STRLEN]={0};
strcpy(node,hostname.nodename); //获取网络上的名称
char* name=strtok(node,".");
//获取绝对路径
char path[STRLEN]={0};
getcwd(path,STRLEN-1);
char*p=path+strlen(path); //p指向绝对路径的末尾
while(*p!='/')
{
p--;
}
//p指向路径末尾往前的第一个‘/’位置处
if(strlen(path)!=1)
{
p++; //++前,p-'/'
}
if(strcmp(path,pw-pw_dir)==0)
{
p="~";
}
printf("\033[;32mMyBash[%s@%s %s]%c\033[0m",pw-pw_name,name,p,flag);
// \033[47;31mThis is a color test\033[0m 设置打印结果的颜色
fflush(stdout);
}
//================================================================================
void Mycd(char*path)
{
//第一个字符串为cd而第二为空 如:cd 则结束本轮循环
if(path==NULL)
{
exit(0);
}
//cd ~ 回到用户根目录
if(strcmp(path,"~")==0)
{
struct passwd*pw=getpwuid(getuid());
path=pw-pw_dir;
}
//cd - 回到上一次的位置
if(strcmp(path,"-")==0)
{
//若是第一次输入命令,则cd -命令不存在!
if(strlen(OLDPWD)==0)
{
printf("\033[;31mMyBash:cd:OLDPWD not set\n\033[0m");
return ;
}
//否则把上一次的命令给path
path=OLDPWD;
}
//getpwd记录当前工作目录的绝对路径
char oldpwd[STRLEN]={0};
getcwd(oldpwd,STRLEN-1);
if(-1==chdir(path))//反之则不是空,则通过chdir系统调用进入到该目录中
{
char err[128]="\033[;31mMybash: cd \033[0m";
strcat(err,path);
perror(err);
}
//每次执行完cd命令后,把工作路径赋给OLDPWD
strcpy(OLDPWD,oldpwd);
}
//================================================================================
//命令分割函数
void Strtok_cmd(char*buff,char*myargv[])
{
char *s=strtok(buff," "); //分割输入的字符串
if(s==NULL) //如果s为空,则进入下一轮循环
{
exit(0);
}
myargv[0]=s; //把分割出来的第一个字符串放在myargv[0]中
int i=1;
while((s=strtok(NULL,""))!=NULL) //把后续分割出来的字符串依次存放在数组中
{
myargv[i++]=s;
}
}
//===============================================================
int main()
{
while(1)
{
char buff[128]={0};
Printf_Info();
//从终端获取命令存入buff中
fgets(buff,128,stdin);
buff[strlen(buff)-1]=0;
char *myargv[MAX]={0};
//分割输入的命令
Strtok_cmd(buff,myargv);
//如果输入exit则退出循环
if(strcmp(myargv[0],"exit")==0)
{
exit(0);
}
//如果分割出来的第一个字符串为cd
else if(strcmp(myargv[0],"cd")==0)
{
Mycd(myargv[1]);
continue;
}
//若是系统调用,直接替换fork+exec
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)
{
char path[256]={0};
if(strncmp(myargv[0],"./",2)!=0 strncmp(myargv[0],"/",1)!=0)
{
//先把路径放入path中
strcpy(path,PATH);
}
//进行命令拼接,路径+名称
strcat(path,myargv[0]);
//替换进程 例如:/bin/ls
execv(path,myargv);
perror("\033[;31mexecv error\033[0m");
}
//处理僵死进程
else
{
wait(NULL);
}
}
}
运行结果如下 :
异常处理如下:
若是第一次运行程序,则不能使用cd - 命令,因为此时还没有历史路径
若进入一个不存在的目录则会报错,没有这个文件或目录
若直接输入一个不存在的无法识别的命令,也会报错。
Q2: linux的shell命令解释器到底要做什么
shell是一个命令解释器。是计算机用户和计算机操作系统内核之间linux命令解释器原理的翻译。计算机用户在操作计算机是输入linux命令解释器原理的指令都是以人类语言来表示linux命令解释器原理的。而计算机在内部进行信息处理是使用linux命令解释器原理的都是二进制。所以shell会将用户的输入转换成计算机能够识别的信息。计算机处理完成后再有shell转换成人能够识别的信息输出。
Q3: Linux基础命令和原理总结
作为一个程序员或者测试开发人员,我们在进行项目部署和运维时,经常会用到一些linux命令,可是这些命令老是忘记,每次用到的时候都要去谷歌百度,很是麻烦!这不,为了自己使用方便,对常见的linux命令, SHELL, VIM, Linux性能调优和linux kernel的总结,以便在用到时能够快速地找到相关命令,同时有需要的朋友也可以参考搜藏该篇文章!文章对讲到的每个命令都有详细的参数解释,并且给出一些常用例子,因此也非常适合用来学习!
shell(命令解释器)自带的命令称为内部命令,其它的是外部命令
内部命令使用help帮助:help cd
外部命令使用help帮助:ls --help
type命令:用于区分是内部命令还是外部命令:
ls is aliased to `ls --color=auto' #外部命令
cd is a shell builtin #内部命令
pwd命令:显示当前目录
ls命令:查看目录和文件名称
ls -l 查看目录各个字段含义
第一字段:首字母代表的是文件类型 ,其中"-"为普通文件、"d"为目录文件、"c"为字符设备文件、"b"为块设备文件、"p"为管道文件、"l"为链接文件、"s"为socket文件。“rwx”分别代表拥有读、写和执行权限,"-代表无对应权限。三个"rwx"依次代表文件所有者、文件所有者所在用户组、其它用户对文件拥有的权限。
第二字段:文件硬连接数量
第三字段:文件拥有者
第四字段:文件拥有者所在组
第五字段:文件大小(以字节为单位)
第六字段:文件最后更改时间
第七字段:文件名(若为链接文件则追加显示其链接的原文件的路径)
ls命令其它参数含义:
-a显示隐藏文件(.开头的文件)
-r逆序排序
-t按照时间顺序显示
-R递归显示
ls -lartR : 按照时间顺序倒序显示所有文件及其文件夹的文件
cd命令:更改当前的工作目录
cd /path/... 绝对路径
cd ./path/... 相对路径(./可以省略)
cd ../path/... 相对路径
mkdir -p 递归目录:递归创建目录
rmdir命令:删除目录
rmdir a/b/c/d/e/ #删除空目录
rm -r a/b/c/d/ #递归删除目录,但是系统会做多次询问
rm -rf a/b/c/d/ #删除目录,不做任何询问
cp命令:复制文件和目录
-r 复制目录
-p 保留用户、权限、时间等文件属性
mv命令:移动文件和重命名
mv *.log 目标目录
通配符:
*匹配任何字符串
?匹配一个字符串
[xyz]任何一个字符串
[a-z]匹配一个范围
cat命令:文本内容显示到终端
head命令:查看文件开头
head -3 文件名称 #显示文件开头3行
tail命令:查看文件末尾
tail -3 文件名称 #显示文件末尾3行
tail常用参数-f,文件内容更新后,同步显示更新的文件信息
tail -f 文件名称
wc命令:统计文件内容信息
wc 文件名称
useradd命令:新建用户
useradd 用户名
userdel命令:删除用户
userdel 用户名 用户所在的家目录不会被删除
userdel -r 用户名 用户相关的所有配置都会被删除
passwd命令:修改用户密码
passwd 用户名
usermod命令:修改用户属性
/etc/passwd文件:查看用户文件
tail /etc/passwd
/etc/shadow文件:查看用户密码
tail /etc/shadow
groupadd命令:添加用户组
groupadd 用户组
groupdel命令:删除用户组
groupdel 用户组
用户切换
su 用户名 切换用户,但是用户所在环境不变,即pwd路径不会变化
su - 用户名 切换用户,同时会切换到用户家目录,即/home/用户名
sudo命令:普通用户需要执行root用户权限的解决方案。
以下是一些常用命令汇总;The following table provides a reminder of most of the commands that we have covered so far. If you include the three, as-yet-unmentioned, commands in the last column, then you will probably be able to achieve 95% of everything that you will ever want to do in Unix (remember, you can use the man command to find out more about top , ps , and kill ). The power comes from how you can use combinations of these commands.
-c 'cc-address' -b 'bcc-address'
'to-address' | Command to send email | | mail -s "Subject"
to-address Filename` | Command to send email with attachment |
File Permission commands
Hope this Linux reference guide helps you!
希望这些常用的命令和系统原理,以及linux操作可以帮助大家提升linux命令和操作!!!
Q4: 什么是命令 行 解释器
就是执行命令用的,不同的操作系统有不同的解释器。
Window下也叫“命令提示符”,可以在开始运行那里输入CMD就会跳出来。
linux的命令解释器叫shell,但linux又有多种不同的shell,常见的有Bourne shell(简称sh),C shell(简称csh),Korn shell(简称ksh)和Bourne Again shell(简称bash)。
ubuntu默认的shell是bash。
而且还有几种不同的终端,但命令和脚本还是由shell来解释和执行的。终端与shell没有对应关系
Q5: 在Linux环境下模拟实现简单命令解释器
用别名来实现就行了,格式:ailas 你喜欢的别名="Linux 命令+参数"
如实现dir:alias dir="ls -la"
实现copy:alias copy="cp"
实现del: alias del="rm -rf"
等等。
关于linux命令解释器原理和linux中命令解释器是的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






