Linux下實現簡單的shell直譯器

2021-07-27 15:03:29 字數 2600 閱讀 7944

shell是系統的使用者介面,提供了使用者與核心進行互動操作的一種介面。它接受使用者輸入的命令並把它送入核心去執行。

實際上shell就是乙個命令直譯器,它解釋有使用者輸入的命令並且把它們送到核心。不僅如此,shell有自己的程式語言用於對命令的編輯,它允許使用者編寫由shell命令組成的程式。shell變成語言具有普通程式語言的很多特點,比如它也有迴圈結構和分支控制結構等,用這種程式語言編寫的shell程式與其他應用程式具有同樣的效果。

shell就是運用程序的程式替換的原理進行實現的。

何為程式替換?

假如作業系統正在執行某乙個程式,然後我們利用程式替換函 數指定乙個新的程式,讓作業系統去執行我們新指定的程式。也就是這樣一種情形下,我們fork乙個程序,如果fork成功,子程序會和父程序執行相同的**,而我們建立子程序是希望子程序執行指定的操作,所以需要執行exec族函式。

何為程式替換函式?

程式替換函式是一族函式,可以通過man命令進行檢視。

其實有六種以exec開頭的函式,統稱exec函式:

#include int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp);

int execv(const char *path, char *const argv);

int execvp(const char *file, char *const argv);

int execve(const char *path, char *const argv, char *const envp);

這些函式如果調⽤用成功則載入新的程式從啟動**開始執⾏行,不再返回,如果調⽤用出錯則返回-1, 所以exec函式只有出錯的返回值⽽而沒有成功的返回值。

不帶字母p (表⽰示path)的exec函式 第⼀乙個引數必須是程式的相對路徑或絕對路徑,例如"/bin/ls"或"./a.out",而不能 是"ls"或"a.out"。對於帶字母p的函式: 如果引數中包含/,則將其視為路徑名。 否則視為不帶路徑的程式名,在path環境變數的目錄列表中搜尋這個程式。

帶有字母l( 表⽰示list)的exec函式要求將新程式的每個命令列引數都當作乙個引數傳給它,命令列引數的個數是可變的,因此函式原型中有…,…中的最後乙個可變引數應該是null, 起sentinel的作用。

帶有字母v( 表⽰示vector)的函式,則應該先構造乙個指向各引數的指標陣列,然後將該陣列的首位址當作引數傳給它,陣列中的最後⼀個指標也應該是null,就像main函式的argv引數或者環境變數表一樣。

對於以e (表⽰示environment)結尾的exec函式,可以把乙份新的環境變數表傳給它,其他exec函式仍使用當前的環境變數表執行新程式。

實現步驟:

1)採用read函式讀取標準輸入寫到顯示器上的資訊,並且返回讀取到的字元個數,如果返回值大於0,說明有讀取到字元,就將讀到的字串的最後加個字串的結束符\0;否則,結束此次迴圈。

2)將讀取到的字串按照空格分成多個字串,放進指標陣列argv中,並在指標陣列的最後加乙個null。

3)建立乙個子程序,父程序等待子程序執行完程式,子程序執行程式替換函式,關於程式替換函式的選擇:我們選擇的是execvp函式(因為我們已經知道要執行的程式的檔名,引數也已經全部儲存在argv指標陣列中)。

#include #include #include #include #include #include #include #include //獲取登陸使用者名稱

void getloginname()

//獲取主機名

void gethostname()

//獲取當前檔案路徑

簡單的shel程式設計

shell程式設計就是對一堆linux命令的邏輯化處理。1 首先要建立乙個可編輯的檔案,即 touch sh。1 如果想讓檔案執行需要修改許可權,原許可權 修改許可權 chmod u x sh 2 執行程式的方式為.sh 3 編寫程式時,要加固定的開頭 bin bash 4 在實際的程式設計過程中,...

linux下MongoDB客戶端shell基本操作

mongodb 是一款nosql資料庫,沒有固定的模式,即同乙個集合中的不同文件結構可以不同,如 第一條記錄,第二條記錄 這在關係型資料庫中是無法實現的。對於mongodb,其中 collections即集合相當於關係型資料庫的表,document文件相當於關係型資料庫中的行。因此也就是說,mong...

linux下利用curl監控網頁shell指令碼

fi備註 這裡介紹乙個使用curl監控頁面可用性的方法。可以使用下面的命令,來採集頁面的狀態碼。如果這條命令返回結果為200,說明服務正常。如果返回的是其他的頁面,說明異常。curl o dev null s w 使用這條命令,再配合郵件和簡訊,就可以實現對頁面的可用性監控。將這個程式部署在全國各地...