关于如何创建自定义的命令,实现linux中的copy功能

最近一段时间,做了关于linux下的shell三个实验,收获颇多。其中一个关于创建自定义命令,来实现linux中的copy功能。自己大一的时候C++学的不是很好,现在突然做这种题目,顿感头大。不得不说,互联网的确是能解决很多困难。首先提到的一种方法是通过alias内建命令的方法,主要做法是:alias 自定义命令名=‘已有命令’。不过这种做法看似方便,不过没有剖开命令见本质,被老师否决了。好吧,开始用自己不擅长的c语言写。下面是第一个版本的:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[])
{
    FILE *in,*out;
    char buf[100];
    size_t size;    
    in=fopen(argv[1],"rb");
    out=fopen(argv[2],"wb+");   
    if(!in)
    {
        printf("open %s failed:%s\n",argv[1],strerror(errno));
        return 1;   
    }
    if(!out)
    {
        printf("open %s failed:%s\n",argv[2],strerror(errno));
        return 1;   
    }
    while((size=fread(buf,1,sizeof(buf),in))==sizeof(buf))
    {
        if(fwrite(buf,1,size,out)<size){
            printf("write error:%s\n",strerror(errno)); 
                    return 1;
        }   
    }
    if(feof(in)){
        printf("sucess!");
    }else{
        printf("error:%s\n",strerror(errno));
    }   
    fclose(in);
    fclose(out);
        return 0;
}

这个版本有个缺陷,使用命令拷贝文件的时候,粘贴的地方名字需要自己给出来如:mycopy 1.txt Documents/1.txt
很多同学也基本上是基于这个原理做的,可是自己感觉这种解法和cpy命令还是区别蛮大的,于是便有了下面这个修订版:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[])
{
    FILE *in,*out;
    char buf[100];
    size_t size;    
    char *t=malloc(strlen(argv[1])+strlen(argv[2])+2);
    strcpy(t,argv[2]);
    strcat(t,"/");
    strcat(t,argv[1]);
    argv[2]=t; 
    in=fopen(argv[1],"rb");
    out=fopen(argv[2],"wb+");   
    if(!in)
    {
        printf("open %s failed:%s\n",argv[1],strerror(errno));
        return 1;   
    }
    if(!out)
    {
        printf("open %s failed:%s\n",argv[2],strerror(errno));
        return 1;   
    }
    while((size=fread(buf,1,sizeof(buf),in))==sizeof(buf))
    {
        if(fwrite(buf,1,size,out)<size){
            printf("write error:%s\n",strerror(errno)); 
                    return 1;
        }   
    }
    if(feof(in)){
        printf("sucess!");
    }else{
        printf("error:%s\n",strerror(errno));
    }   
    fclose(in);
    fclose(out);
}

只是添了五行代码呈现的效果就不同了。这是该命令呈现的效果:
图片

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值