上面說到了允許安裝多個shell,但是呢?在linux中,總是作為/bin/sh安裝的標準shell是gun工具的bash。它是乙個優秀的shell,總是被安裝在linux上,而且開源還能被移植倒幾乎所有的類unix系統上,所以我們呢把它作為要使用的shell。bash就是linux預設的shell。懂了吧?
bash它有啥好處呢?有些好處就是在我們使用的時候我們用著感覺沒什麼啊?其實確實提供了很大的便利。比如說,1.按上下鍵就可以找到之前或者之後輸入的命令?哇這個也太方便了。。據資料記載,它的記憶功能可以達到1k個。(命令編修能力)2.關於tab鍵的使用,①[tab] 接在一串指令的第乙個字的後面,則為命令補全; ②[tab] 接在一串指令的第二個字以後時,則為『檔案補齊』,這樣少打很多字,還能確定輸入的資料是正確的。等等,先不詳盡說它的好處了,但是我們今天的功能實現還是一部分簡單功能。
先來說說吧,我相信再我們自己嘗試做出自己的簡單bash功能後會對bash的功能認識得更清楚。
在寫這些**的時候我們的思路自然是從bash所能實現的最簡單的功能開始做,再不斷根據我們系統本身的bash再不停的加上功能。
1.實現不帶引數的命令
2.實現帶引數的命令,並且使用者資訊顯示位置的地方不再是我們上面寫的固定的,隨我們操作變化而變化。也就是上圖中用紅色長方形框出來的地方。
#include #include #include #include #include #include #include define max 10 //定義巨集
void printfinfon()
struct passwd *ptr = getpwuid(id);
/* 函式getpwuid是通過使用者的uid查詢使用者的passwd資料
需要#include 標頭檔案 */
if ( ptr == null )
char hostname[128] = ; //返回本地主機的標準主機名
gethostname(hostname,128);
char cur_dir[256] = ;
getcwd(cur_dir,256); //getcwd會將當前工作目錄的絕對路徑複製到引數buff中
char* q = "/";
char* p = strtok(cur_dir,"/");
while( p != null )
printf("[%s@%s %s]%s",ptr->pw_name,hostname,q,userid);
fflush(stdout);
}//argc:引數個數,ar**:引數內容,envp:環境變數
int main(int argc,char* ar**,char*) envp)
; //定義乙個buff陣列並初始化
fgets(buff,128,stdin);
/* fgets讀取一行時會包括行尾的"\n", 只適合讀文字檔案
而不適合讀二進位制檔案,並且文字檔案中的所有字元都應該是可見字元
不能有"\0",其中stdin為標準輸入的意思,*/
buff[strlen(buff)-1]=0;
/* 讀取了乙個字串,把最後乙個'\n'變成0 */
char * myar**[max]=; //定義自己的引數列表,從而支援命令+引數,置0
//輸入的引數我們需要分割,使用函式strtok
int i=0;
char *s=strtok(buff," "); //例如輸入 cp a.c b.c每有空格就分割
while( s != null )
/* 只要s還不為空,就接著上面還未分割完成的繼續分割
如果使用buff那就還是原來的字串總是在分割第一部分
寫了null這裡為空,他就接著上面的分割 */
char *cmd=myar**[0];
if(cmd==null)
/*判斷buff陣列的第一位是否為空,如果為空那就是我們平時使用的直接回車
那就應該接著*/
if(strcmp(cmd,"exit")==0)
/*使用字串比較輸入的命令是否為exit,如果是那就直接退出了
函式strcmp比較兩個字串如果相等那就返回0,不相等那就返回乙個非0值*/
if ( strcmp(cmd,"cd") == 0 )
continue;
}/* cd不是通過bash:fork+exec來實現的,cd是乙個內建命令,要用函式來實現
所有外接命令是通過fork+exec來實現的 */
/*定義pid需要使用到pid_t型別需要用到頭檔案(#include ),其實
這是乙個被typedef改過之後是個型別,實質上還是int*/
pid_t pid = fork(); //執行這行程式就要複製這個程式了
/*需要注意的是fork函式是複製程序的,父程序的fork返回值是子程序的id號,
子函式fork返回值是0*/
if(pid==-1) //複製失敗時
if(pid==0) //複製成功後將子程序替換
int val = 0;
wait(&val); //解決殭屍程序
自己去實現一些bash的功能,會發現它不就是複製乙份自己然後再替換程序,從而替換成新的程序。當然這些是所有的外接命令,比如說內建命令比如cd就不是靠fork+execl來實現的。這裡我們不做深究。
mybash還可以增加其他更多功能,後面我們本篇文章繼續更新。
改天見!
關於JAVA中Calendar類的部分功能記錄
2017.3.21 定義calendar類 calendar calendar calander.getinstence 獲取calendar中部分數值calendar.get calendar.可選 date 日期day of month 這個月第幾天 day of week 星期幾 week o...
常見linux命令釋義(第四天) bash部分
學linux的時候,我跳過了一些很重要的東西。比如分割槽。還有vim的深入學習。分割槽沒有學習是因為我裝的是虛擬機器,不知道是什麼原因,格式化分割槽不能正常顯示。至於vim,簡單的增刪改查我已經了解了。能夠順利在linux下,進行檔案的編輯。我追求不高,不想在這個上面去深究。等我把這本 鳥哥的私房菜...
Linux 在bash中對檔案轉碼
在linux中上傳帶有中文內容的test.csv檔案。gbk編碼 cat 的時候發現中文亂碼的現象,於是在bash中對其轉碼。一 相關命令 file mime encoding filename 顯示檔案編碼 iconv l 檢視linux 系統所支援的檔案編碼種類 iconv f old enco...