Linux中自建bash部分功能(mybash)

2021-09-29 09:43:44 字數 3336 閱讀 9459

上面說到了允許安裝多個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...