如何用c语言写一个shell

如何用c语言写一个shell,第1张

鸟哥是不会有这个的,可以这样想(感觉这样很麻烦,只用一对管道应该也可以,流程也能简单,控制好进程顺序就行。这个编得过):

#include <stdioh>

#include <stdlibh>

#include <stringh>

#include <fcntlh>

#include <unistdh>

#include <sys/waith>

#define CMD_LINE 1024

#define PIPE_MAX 16

#define ARG_MAX 10

typedef struct {

char arg[ARG_MAX];

char in;

char out;

} cmd_t;

extern int parse_token(char buf, cmd_t cmd[]);

extern int parse(char buf, cmd_t cmd);

extern int test_parse(cmd_t cmd[], int len);

int main(int argc, char argv[])

{

char buf[CMD_LINE];

cmd_t cmd[PIPE_MAX + 1];

int fd[PIPE_MAX][2];

int j, i;

int cmd_len, pipe_len;

pid_t pid;

while (1) {

printf("my_shell#");

fgets(buf, CMD_LINE, stdin);

buf[strlen(buf) - 1] = '\0';

cmd_len = parse_token(buf, cmd);

pipe_len = cmd_len - 1;

if (pipe_len > PIPE_MAX)

continue;

for (i = 0; i < pipe_len; ++i)

pipe(fd[i]);

for (i = 0; i < cmd_len; ++i)

if ((pid = fork()) == 0)

break;

if (pid == 0) {

if (pipe_len) {

if (i == 0) {

close(fd[i][0]);

dup2(fd[i][1], 1);

close(fd[i][1]);

for (j = 1; j < pipe_len; ++j)

close(fd[j][0]),

close(fd[j][1]);

} else if (i == pipe_len) {

close(fd[i - 1][1]);

dup2(fd[i - 1][0], 0);

close(fd[i - 1][0]);

for (j = 0; j < pipe_len - 1; ++j)

close(fd[j][0]),

close(fd[j][1]);

} else {

dup2(fd[i - 1][0], 0);

close(fd[i][0]);

dup2(fd[i][1], 1);

close(fd[i][1]);

for (j = 0; j < pipe_len; ++j) {

if ((j != i - 1)

|| (j != i))

close(fd[j][0]),

close(fd[j]

[1]);

}

}

}

if (cmd[i]in) {

int fd = open(cmd[i]in, O_RDONLY);

dup2(fd, STDIN_FILENO);

close(fd);

}

if (cmd[i]out) {

int fd =

open(cmd[i]out,

O_RDWR | O_CREAT | O_TRUNC, 0644);

dup2(fd, STDOUT_FILENO);

close(fd);

}

execvp(cmd[i]arg[0], cmd[i]arg);

fprintf(stderr, "Failed exec\n");

exit(127);

}

/ parent /

for (i = 0; i < pipe_len; ++i)

close(fd[i][0]), close(fd[i][1]);

for (i = 0; i < cmd_len; ++i)

wait(NULL);

}

return 0;

}

int parse_token(char buf, cmd_t cmd[])

{

int n = 0;

#if 1

char save_p;

char p = strtok_r(buf, "|", &save_p);

while (p != NULL) {

parse(p, &cmd[n++]);

p = strtok_r(NULL, "|", &save_p);

}

#else

cmd[n]arg[0] = "ls";

cmd[n]arg[1] = "-l";

cmd[n]arg[2] = NULL;

#endif

return n;

}

int test_parse(cmd_t cmd[], int len)

{

int i;

for (i = 0; i < len; ++i) {

printf("cmd[%d]:", i);

int j = 0;

while (cmd[i]arg[j])

printf(" %s", cmd[i]arg[j++]);

if (cmd[i]in)

printf("\tin:%s", cmd[i]in);

if (cmd[i]out)

printf("\tout:%s", cmd[i]out);

printf("\n");

}

return 0;

}

int parse(char buf, cmd_t cmd)

{

int i = 0;

cmd->in = NULL;

cmd->out = NULL;

char p = strtok(buf, " ");

while (p) {

if (p == '<') {

if ((p + 1))

cmd->in = p + 1;

else

cmd->in = strtok(NULL, " ");

} else if (p == '>') {

if ((p + 1))

cmd->out = p + 1;

else

cmd->out = strtok(NULL, " ");

} else

cmd->arg[i++] = p;

p = strtok(NULL, " ");

}

cmd->arg[i] = NULL;

return 0;

}

当然是在linux系统下啦,shell是包裹在linux内核的外壳,你要和linux系统交互,就要通过和shell与之交互。其实也就是翻译的角色,所以shell本身就是命令解析器,就是环境。

它c语言没什么联系,除了它本身是C语言写的以外。。。

这是两种不同的编程方式。比如,C程序可以再VC++编译器中编译。而Java程序可以用eclipse。shell脚本则可以在linux的外壳shell下。

shell是linux一个人机界面的程序。它有ksh,bsh,csh,tsh等等,每种shell尽管都差不多,但都分别有些差别,具体写script的时候,需要看对应的shell的语法。

一个shell程序用什么解释,是体现在开头这句,和其他手稿语言如perl一样。格式如下:

#!/bin/sh

表明这个手稿程序,是用bash解释的。

shell是一个命令处理器(command processor)——是一个读入并解释你输入的命令的程序。除了是一个命令中断器以外,shell还是一个程序设计语言。你可以编写shell可以解释的程序(被称为源程序),这些源程序可以包含shell程序设计命令等等。shell除了解释命令以外,还有其他工作,它也可以配置和编程。shell拥有自己的语言允许用户编写程序并以一种复杂方式运行。shell编程语言具有许多常用的编程语言的特征,例如:循环和控制结构等。用户可以生成像其他应用程序一样复杂的shell程序。

补充说明:简单的说 : shell 是一个交互性命令解释器。shell独立于 *** 作系统,这种设计让用户可以灵活选择适合自己的shell。shell让你在命令行键入命令,经过shell解释后传送给 *** 作系统(内核)执行。

一下是shell功能的一个汇总:

查找命令的位置并且执行相关联的程序。

为shell变量赋新值

执行命令替代

处理 I/O重定向和管道功能

提供一个解释性的编程语言界面,包括tests、branches和loops等语句

#!/bin/sh

for ((i=1;i<20;i=i+2));

do

echo $i

done

类似于DOS下的commandcom和后来的cmdexe。它接收用户命令,然后调用相应的应用程序。

命令行式shell(Command Line Interface shell ,即CLI shell)

例如:

bash / sh / ksh / csh / zsh(Unix/linux 系统)

扩展资料:

传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。

文字 *** 作系统与外部最主要的接口就叫做shell。shell是 *** 作系统最外面的一层。shell管理与 *** 作系统之间的交互:等待输入,向 *** 作系统解释你的输入,并且处理各种各样的 *** 作系统的输出结果。

shell提供了与 *** 作系统之间通讯的方式。这种通讯可以以交互方式,或者以shell script方式执行。shell script是放在文件中的一串shell和 *** 作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。

执行一个shell程序的一种方法是:sh shell_program arguments这种方式激活一个子shell并且指定这个子shell为执行这个程序的命令解释器。这个程序文件不是必须为可执行的。也可以在shell程序的第一行前加入#!/usr/bin/ shell_name来指定命令行解释器。因此,如果你当前正在Bourne shell下工作,但是想要执行一个C shell的脚本,你的C shell程序的第一行应该为:此时shell脚本的许可权限必须被设置为可读和可执行。为了让shell可以找到程序,可以选择输入shell脚本的完全路径名,或者将这个脚本的路径放在于PATH环境变量指定的路径列表中。

shell脚本和windows平台上的bat批处理是一样的,简化用户处理重复动作的 *** 作,shell脚本由shell命令组成。

工具/原料

vim

ubuntu

方法/步骤

新建一个文件shell脚本一般用×sh作为后缀当然勇气他的也可以。打开终端输入touch

firstsh

新建一个名为first的shell脚本。

编写一个简单的linuxshell脚本

使用vim

编辑firstsh也可以用其他的文本编辑器,推荐使用vim

使用命令

vim

firstsh打开,输入i进入编辑模式。

编写一个简单的linuxshell脚本

我们写入一个简单的shell脚本,注意第一行的代码解释器的指定,这里使用的是/bin/bash/

解释器

也可用其他的根据个人情况自己选择。

脚本解释:

echo

//显示一串字符并自动换行

read

NAME

//从屏幕获取一段字符,并赋予NAME

$NAME

//取NAME变量的值

#

//只用一个#表示注释文本

编写一个简单的linuxshell脚本

文件写完后按下esc键

退出插入模式,接着输入:wq

保存文本并退出文本编辑。

编写一个简单的linuxshell脚本

输入sh

+

脚本名称

运行脚本,或给文件可运行权限

chmod

+x

然后输入/firstsh运行脚本。

以上就是关于如何用c语言写一个shell全部的内容,包括:如何用c语言写一个shell、在哪里编写shell程序、unix的shell程序怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10049672.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存