1. 程式人生 > >Linux下建立自定義命令的過程

Linux下建立自定義命令的過程

本文通過實現一個“建立C語言標頭檔案和原始檔模板”的dn命令作為例子演示linux中實現帶引數的命令過程。

第一步:實現命令原始碼:

/**********************************************************    
FileName : dn.c 
FileFunc : Linux下實現.c和.h檔案模板    
Version  : V0.1     
Author   : qiuyigui     
Date     : 2013-03-30
Descp    : Linux下實現命令列實用程式   
*************************************************************/ 
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <time.h>  

void GetLocalTime( char *pOutTime ); 
unsigned char createfile( unsigned char ucFileFlag,char *pFilename ); 
void StrToUpper( char *pcStr ); 
void write_h( FILE *fp ,char *pFileName,char *pAliasName); 
void write_c( FILE *fp,char *pFileName ); 


void GetLocalTime( char *pOutTime )   
{   
time_t t;   
struct tm tm1;   
t = time(NULL);   
memcpy(&tm1,localtime(&t),sizeof(struct tm));   
sprintf(pOutTime,"%04d-%02d-%02d %02d:%02d:%02d",tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);   
/*YYYYMMDDHHMMSS(年月日時分秒)   */ 
}   

void StrToUpper( char *pcStr ) 

while( '\0'!=*pcStr ) 

    if( islower(*pcStr) ) 
    *pcStr -= 32;  
    ++pcStr; 

int main( int argc,char *argv[] )   

unsigned char ucRetCode = 1; 
 
if( 2==argc )   
{   
    if( 0==memcmp(argv[1],"--help",strlen(argv[1])) ) 
    { 
        fprintf(stderr,"用法:dn 選項... 檔案... \n"); 
        fprintf(stderr,"根據<選項>引數的設定來選擇建立指定的<檔案>是.h檔案還是.c檔案。\n"); 
        fprintf(stderr,"\n<選項>    <檔案> 引數的設定\n"); 
        fprintf(stderr,"-h  filename        建立名為filename.h檔案\n"); 
        fprintf(stderr,"-c  filename        建立名為filename.c檔案\n"); 
        fprintf(stderr,"--help              顯示此幫助資訊並退出\n"); 
        fprintf(stderr,"--version           輸出版本資訊並退出\n"); 
        fprintf(stderr,"\n如遇到問題,請向 <

[email protected]> 報告錯誤。\n"); 
    } 
    else if( 0==memcmp(argv[1],"--version",strlen(argv[1])) ) 
    { 
        fprintf(stderr,"create (free code) 1.01\n"); 
        fprintf(stderr,"這是自由軟體,相互交流學習可以加入QQ:58114361\n"); 
        fprintf(stderr,"\n"); 
        fprintf(stderr,"由qiuyigui編寫\n"); 
    } 
    else 
    { 
        fprintf(stderr,"%s:無效選項\"%s\"   \n",argv[0],argv[1]); 
        fprintf(stderr,"請嘗試執行 \"dn --help\" 來獲取更多的資訊. \n"); 
    }              
     
    exit (1);   
}   

if( 3!=argc ) 

    fprintf(stderr,"%s:無效選項  \n",argv[0]); 
    fprintf(stderr,"請嘗試執行 \"dn --help\" 來獲取更多的資訊. \n"); 
    exit (1); 

 
if( '-'==*argv[1]) 
{    
    if( 0==memcmp(argv[1],"-h",strlen(argv[1])) ) 
    {    
        ucRetCode = createfile(0,argv[2]); 
    }    
    else if( 0==memcmp(argv[1],"-c",strlen(argv[1])) ) 
    {    
        ucRetCode = createfile(1,argv[2]);                   
    }    
    else 
    { 
        fprintf(stderr,"%s:無效選項\"%s\"  \"%s\" \n",argv[0],argv[1],argv[2]); 
        fprintf(stderr,"請嘗試執行 \"dn --help\" 來獲取更多的資訊. \n");  
        exit(1); 
    }    
     

else 

    fprintf(stderr,"%s:無效選項\"%s\"  \"%s\" \n",argv[0],argv[1],argv[2]); 
    fprintf(stderr,"請嘗試執行 \"dn --help\" 來獲取更多的資訊. \n");  
    exit(1); 
}    
 
return ucRetCode; 


unsigned char createfile(unsigned char ucFileFlag,char *pFilename) 

unsigned char ucRetCode = 1; 
char szFileName[30]; 
char szAliasName[30]; 
 
FILE *fp = NULL; 
unsigned int uiI; 
 
if( strlen(pFilename)>27 ) 

    fprintf(stderr,"%s:建立檔案失敗,檔名長度太長!\n",pFilename); 
    return 1; 
}     
 
memset(szFileName,0,sizeof(szFileName)); 
 
if( !ucFileFlag ) 
{    
    sprintf(szFileName,"%s.h",pFilename); 

else 

    sprintf(szFileName,"%s.c",pFilename); 
}    
 
memset(szAliasName,0,sizeof(szAliasName)); 
sprintf(szAliasName,"%s",pFilename); 
StrToUpper(szAliasName); 
fp = fopen(szFileName,"r"); 
if( NULL!=fp ) 

    fclose(fp); 
    fprintf(stderr,"%s:建立檔案失敗,你指定的檔名當前目錄下已經存在!\n",pFilename); 
    return 1; 
}    
 
fp = NULL; 
fp = fopen(szFileName,"a"); 
if( NULL==fp ) 

    fprintf(stderr,"%s:建立檔案失敗!\n",pFilename); 
    return 1; 

if( !ucFileFlag ) 

    write_h(fp,szFileName,szAliasName); 

else 

    write_c(fp,szFileName); 
}    
fclose(fp); 
 
return 0; 


void write_h( FILE *fp ,char *pFileName,char *pAliasName ) 

char szTime[30]; 
 
memset(szTime,0,sizeof(szTime)); 
GetLocalTime(szTime); 
fprintf(fp,"/*************************************************************\n"); 
fprintf(fp,"    FileName : %s \n",pFileName); 
fprintf(fp,"    FileFunc : 定義標頭檔案  \n"); 
fprintf(fp,"    Version  : V0.1  \n"); 
fprintf(fp,"    Author   : Sunrier  \n"); 
fprintf(fp,"    Date     : %s \n",szTime); 
fprintf(fp,"    Descp    : Linux下標頭檔案 \n"); 
fprintf(fp,"*************************************************************/\n"); 
fprintf(fp,"#ifndef   __%s_H__\n",pAliasName); 
fprintf(fp,"#define   __%s_H__\n",pAliasName); 
fprintf(fp,"\n"); 
fprintf(fp,"#ifdef __cplusplus\n"); 
fprintf(fp,"extern \"C\" {\n"); 
fprintf(fp,"#endif\n"); 
fprintf(fp,"\n\n\n\n"); 
fprintf(fp,"#ifdef __cplusplus\n"); 
fprintf(fp,"}\n"); 
fprintf(fp,"#endif\n"); 
fprintf(fp,"\n"); 
fprintf(fp,"#endif\n");          
 

void write_c( FILE *fp,char *pFileName ) 

char szTime[30]; 
 
memset(szTime,0,sizeof(szTime)); 
GetLocalTime(szTime); 
fprintf(fp,"/*************************************************************\n"); 
fprintf(fp,"    FileName : %s \n",pFileName); 
fprintf(fp,"    FileFunc : 定義實現檔案  \n"); 
fprintf(fp,"    Version  : V0.1  \n"); 
fprintf(fp,"    Author   : Sunrier  \n"); 
fprintf(fp,"    Date     : %s \n",szTime); 
fprintf(fp,"    Descp    : Linux下實現檔案 \n"); 
fprintf(fp,"*************************************************************/\n"); 
fprintf(fp,"#include <stdio.h>\n"); 
fprintf(fp,"\n"); 
fprintf(fp,"int main(int argc,char *argv[])\n"); 
fprintf(fp,"{\n"); 
fprintf(fp,"\n\n"); 
fprintf(fp,"    return 0;\n"); 
fprintf(fp,"}\n"); 
fprintf(fp,"\n"); 
}

第二步:建立man手冊文件:

.\"表示:行首註釋  而\":表示在行中的註釋
.\":dn命令程式手冊頁的例項
.TH DN 1 "2013-03-30" "dn 1.01" "User Commands"
.\"DN:表示標題
.\"1:表示此命令出現在手冊頁的第幾部分,範圍為1-8的數字,和定義這個檔名小數點後的數字一致
.\""2013-03-30":表示"2013-03-30"顯示在整個頁的下中
.\""dn 1.01":表示"dn 1.01"顯示在整個頁的左下
.\""User Commands":表示"User Commands"顯示在整個頁的上中
.\".TH在檔案的開始,主要說明標題
.SH NAME
.\"說明名稱
.\".SH從行首開始,靠左邊,寬體
\fBdn\fR \- A simple demonstration application creates a file that head file or c file .
.\"-:表示為\-
.SH SYNOPSIS
.\"說明語法格式
.B dn
.\".B:表示寬體,如果本行沒有文字,則.B標籤的下一行為寬體
\-OPTION... FILE...
.SH DESCRIPTION
.\"說明本命令或程式等的相關描述
This manual page document is from qiuyigui . \fBdn\fR is a common application for create a new file that .c or .h file .
.\"\fB文字\fR:表示將該文字設定成寬體
.\"\fI文字\fR:表示將文字加下劃線
.\".:表示為\&.
.SH OPTIONS
.\"說明引數選項設定
It will decide to create a .h file or .c file
.sp
.\".sp:表示空行
.B \-h
It will create a new head file
.sp
.B \-c
It will create a new c file
.sp
.B \-\-help
display this help and exit
.sp
.B \-\-version
output version information and exit
.SH COPYRIGHT
.\":版權宣告
\fBdn\fR is Copyright qiuyigui .This program is free  software ,you can redistribute it or modify it under the GNU General Public License as published by the free software foundation .
.SH SEE ALSO
.\":其他參考
This program is a template of c and h files to quickly create .
.SH REPORTING BUGS
.\":漏洞說明
.TP 0
.\".TP n:表示TP標籤下的第2行開始縮排n個字元(在第1行超過n字元的前提下) n預設值為7
.\".TP 0:表示Report bugs to <
[email protected]> .這一句縮排0個字元,這句即為了實現換行的作用
There probably are some,but I don't know that what they are yet.
Report bugs to <qiuyigui
@gmail.com> .
.SH AUTHOR
.\":文件編寫作者
Written by qiuyigui .

.\"看顯示建立man手冊命令的結果groff -Tascii -man dn.1(注:此時不會建立任務檔案,只是看下顯示效果)
.\"gzip dn.1 把dn.1壓縮成.gz 檔案,會建立一個dn.1.gz的檔案,而dn.1檔案會在gzip執行完後刪除
.\"如果想保留原檔案可以這樣用:gzip -c dn.1 > dn.1.gz
.\"把檔案dn.1.gz放到/usr/share/man/man1下就可以完成dn命令的man手冊了
.\"當執行man dn後還會在在/var/cache/man/cat1/dn.1.bz2建立一個dn.1.bz2壓縮檔案

第三步:建立Makefile,內容如下:

#makefile  
OBJS = dn 
all:$(OBJS)   
CFLAGS = -O -w -ansi      
#CFLAGS = -O -Wall -ansi      
CC = gcc $(CFLAGS) 
 
dn:dn.c   
 @$(CC) -o [email protected] $?  
 @gzip -c dn.1 > dn.1.gz  
 @mv dn.1.gz /usr/share/man/man1 
#gzip壓縮成.gz 檔案  
#gzip不加引數時,預設壓縮檔案時,不儲存原來的檔案;  
#如gzip create.1 結果只有壓縮檔案create.1.gz,原檔案create.1沒有了.  
clean: 
 @ls | grep -v ^makefile$$ | grep -v [.]c$$ | grep -v [.]h$$ | grep -v [.]1$$ | grep -v [.]txt$$ | xargs rm -rf 
#makefile

第四步:Make生成dn二進位制執行檔案

第五步:例項:

[email protected]:/opt/work/dn# ./dn --version
create (free code) 1.01
這是自由軟體,相互交流學習可以加入QQ:58114361

由qiuyigui編寫

把dn檔案放入/usr/bin下可以省去前面的"./"

相關推薦

Linux建立定義命令過程

本文通過實現一個“建立C語言標頭檔案和原始檔模板”的dn命令作為例子演示linux中實現帶引數的命令過程。 第一步:實現命令原始碼: /**********************************************************     FileNa

linux建立定義服務

利用systemctl建立服務   歷史版本中的linux對服務的操作是通過service來完成的。若建立使用者自定義的服務, 則需要較為複雜的操作。目前linux新的發行版已經內建了systemctl來操作服務。 服務指令碼編寫   新的自定義服務指令碼以serv

linux添加定義命令

定義 目錄 ali 當前 進入 自定義命令 回車 nbsp 末尾 想添加一個命令, 比如我輸入 cdms 按回車, 然後就執行了: cd /mnt/gopath/src/test/app/ 這條命令方法: vi /etc/bashrc   在文件末尾添加

Linux新增定義指令碼到開機啟動的方法

chkconfig --add auto_coreseek.sh   完事。   然後研究下這都是些毛意思。 chkconfig有幾個等級: 0:表示關機 1:表示單使用者模式 2:表示無網路連結多使用者命令列模式 3:表示有網路連結多使用者命令列模式 4:表示不可用情況 5:表示帶圖形介面的多使用者模式 6

linux建立邏輯卷命令

fdisk -uv dev/sda 按n新增分割槽 按t 改變分割槽id 按w儲存退出 partx -a /dev/sda pvcreate /dev/sda6 vgcreate  myvg(邏輯卷名稱)/dev/sda6 lvcreate -L 200M - lvtest

ThinkPHP建立定義命令

第一步,配置command.php檔案,目錄在application/command.php <?php return [ 'app\home\command\Test', ]; 第二步,建立命令類檔案,新建application/ho

linux/mac的配置定義命令alias

root commit 測試 自定義命令 bashrc 文件 自動 一個 cdr linux/mac下的自定義命令alias,並保存別名使其永久生效(重啟不會失效) 在做開發每次提交代碼的命令都是一長串參數,不想去記,於是可以使用alias命令來解決這個問題:alias a

Linux系統定義命令

假如我們想用ssh命令遠端登入伺服器, 一般的命令格式如下ssh [email protected]_address但是每次登入伺服器都要輸入一遍IP地址,不僅繁瑣而且浪費時間,所以使用者自定義命令會非常方便我們的使用.這裡介紹一種使用 命令別名alias 的方法,

linux中添加定義命令

系統配置 永久 c中 取消 bsp /etc/ 註意 指令 詳解 centos下設置alias別名,比較簡單,例如: vim /root/.bashrc addalias rm=‘rm -i‘ Linux alias設置指令的別名命令詳解 功能說明:設置指令的別名。語 

Linux定義命令

img etc 自己的 type 命令歷史 令行 cal 白色 屬性 Linux自定義提示符 先上圖,自己看一下效果! 1.命令提示符:prompt [root@localhost ~]# 2.命令提示符後面的符號‘#‘,‘$‘表是兩種

【TP5.1】建立通用的基類定義命令

author:咔咔 wechat:fangkangfk   在之前我們一直在做admin下的業務,在設定自定義模板的時候沒有考慮到一些情況   下面我們來改動一下 這樣做就ok了,不管是建立admin下的控制器,還是index的控制器,這一個模板就可以

Linux 新增定義命令

一般來說,Shell的初始化指令碼分為2種:一種是全域性預設的,一種是使用者自己的。 全域性預設的路徑為/etc/profile在profile中,它預設會再載入/etc/bash.bashrc。 另一種使用者自己的就是$HOME目錄下的.profile它預設會載載入.bas

Linux開機啟動定義shell指令碼

一、Ubuntu下 1、方法一,編輯rc.loacl指令碼  Ubuntu開機之後會執行/etc/rc.local檔案中的指令碼, 所以我們可以直接在/etc/rc.local中新增啟動指令碼。【進入到/etc/rc5.d下,發現S99rc.local,即開機軟

使用dd命令Linux建立大檔案,批量大小檔案生成方法

前沿:最近在開發自動從U盤拷貝大批量檔案到linux系統的的功能。由於需要幾十個G的大檔案來做測試,如果自己去找這麼多資源,然後再拷貝,非常麻煩。所以學了下dd命令,現在總結一下: 一、引數介紹 if=FILE         從FILE中讀取資料,而不是預設的標準輸入。

linux如何進行mysql命令建立資料庫

我們除了可以在mysql資料庫或phpmyadmin中登陸資料庫我們還可以使用linux中命令進行建立,下面我來給大家介紹一個簡單的資料庫建立方法吧。 首選用putty連線linux伺服器,進行命令列 輸入mysql -u+資料庫使用者 -p+資料庫密碼 架設資料庫使用

Linux新增定義命令方法

在我們需要進行Linux開發的時候,有時候需要新增自定義的命令,這樣可以有效提高工作效率。 那麼如何做到呢? 這裡假設我需要完成一個功能,並自定義這個命令為findme: 在當前目錄下查詢包含輸入的關鍵字的檔案有哪些,並以顏色標誌出來。 則可以將如下程式

linux終端定義命令的別名

現在做開發每次提交程式碼的命令都是一長串引數,不想去記,於是可以使用alias命令來解決這個問題: alias aCommandAlias='aCommand 一堆引數什麼的' 比如 alias gpush='git push origin HEAD:refs/for/master' 這樣在終端中,只需要輸入

linux 定義命令

用到:       alias命令       bashrc檔案 * 顯示已有的自定義命令:  alias                    * 新增自定義命令:         alias

Linux/macOS 為程式建立定義程序名的程序 [以 python 為例]

在系統中可能會多次使用 python 執行 py 檔案,或在終端直接執行 python 命令列,因此可能會建立多個 PID 不同,但程序名都為 python 的程序。而通過 ps 命令就會獲取多個程

Linux新增定義命令

想要新增一個命令 cdh 輸入cdh就能直接進入/usr/share/nginx/html目錄 方法:vi /etc/bashrc          在檔案末尾新增alias cdh='cd