众所周知,Linux系统命令行下自带几千个功能强大,使用方便的命令。那这些命令是如何实现的呢,下面我就通过一个简单的例子说明。
例如我们要实现一个简单的功能,通过工具在一个文本中找出我们指定的关键字,并打印出关键词所在行。(ps:grep命令可以高效的完成这一任务,在此暂且忽略)
我们所使用的编译器是GCC,使用语言为C++。以下是代码以及编译过程。
$ cat findKeyword.cpp
#include<iostream>
#include<string>
#include<fstream>
#define MAX_LEN 512
using namespace std;
int main(int argc, char **argv)
{
if(0 == argc || NULL == argv)
{
cout<<"Usage: "<<argv[0]<<" fileName keyword"<<endl;
return -1;
}
ifstream infile(argv[1]);
string keyword(argv[2]);
if(!infile.is_open())
{
cout<<"error in open file."<<endl;
return -2;
}
int lineNum = 0;
int countKeyword = 0;
string line="";
while(getline(infile,line))
{
lineNum++;
if(line.find(keyword) != string::npos)
{
countKeyword++;
if(!line.empty())
{
cout<<"(line: "<<lineNum<<") "<<line<<endl;
}
}
}
infile.close();
return 0;
}
使用g++命令进行编译。
$ g++ findKeyword.cpp -o findkeyword
$ ls
findKeyword.cpp findkeyword
下面测试一下功能是否正确:写一个testfile.txt,内容如下
Today is a good day.
I meet my good friends.
They are
LC
YX
WMY
and
we have a good meal cooked by LC.
执行findkeyword命令。$ ./findkeyword test.txt LC
(line: 4) LC
(line: 8) we have a good meal cooked by LC.
OK,结果是我们预期的。但是,这怎么看都不像是系统自带命令的样子,难道我每次想使用这个命令都得找到它所在的路径吗,那这也太土了。Of course not。我们要使用环境变量帮我们完成最后一个步骤。
将命令所在路径加入到PATH中去,那后面只要我们登录到终端就可以使用自己的命令,就像使用系统自带命令一样方便。具体步骤如下:
$ vim ~/.bash_profile
在最后两行添加如下内容PATH=$PATH:/Users/blue/Documents/CPPFILES/mybin
export PATH
其中/Users/blue/Documents/CPPFILES/mybin是命令所在路径。好了,经过上面的过程,我们在系统上添加了属于我们自己的命令。看下效果把~
新打开一个终端,使用我们自定义的工具就像使用系统命令一样方便。