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如遇到問題,請向 <
}
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