Linux 實現簡單的互動式shell

2021-10-04 09:54:31 字數 1723 閱讀 4741

實現簡單的互動式shell

使用已學習的各種c函式實現乙個簡單的互動式shell,要求:

1、給出提示符,讓使用者輸入一行命令,識別程式名和引數並呼叫適當的exec函式執行程式,待執行完成後再次給出提示符。

2、該程式可識別和處理以下符號:

1) 簡單的標準輸入輸出重定向:仿照例 「父子程序ls| wc -l」,先dup2然後exec。

2) 管道(|):shell程序先呼叫pipe建立管道,然後fork出兩個子程序。乙個子程序關閉讀端,呼叫dup2將寫端賦給標準輸出,另乙個子程序關閉寫端,呼叫dup2把讀端賦給標準輸入,兩個子程序分別呼叫exec執行程式,而shell程序把管道的兩端都關閉,呼叫wait等待兩個子程序終止。類似於「兄弟程序間ls| wc –l」練習的實現。

你的程式應該可以處理以下命令:

○ls△-l△-r○>○file1○

○cat○<○file1○|○wc△-c○>○file1○

注:○表示零個或多個空格,△表示乙個或多個空格

實現步驟:

1. 接收使用者輸入命令字串,拆分命令及引數儲存。(自行設計資料儲存結構)

2. 實現普通命令載入功能

3.實現輸入、輸出重定向的功能

4.實現管道

5.支援多重管道

實現上述功能的原始碼如下:

#include #include #include #include #include #include #define maxline 4096

#define maxpipe 16

#define maxarg 8

struct cmd[maxpipe+1];

int parse(char *buf, int cmdnum)

if (*p == '<')

if (*p == '>')

if (*p != ' ' && ((p == buf) || *(p-1) == '\0')) else

}p++;

}if (n == 0)

cmd[cmdnum].ar**[n] = null;

return 0;

}int main(void)

if (cmd_num == maxpipe + 1)

break;

}if (!cmd_num)

continue;

pipe_num = cmd_num - 1; //根據命令數確定要建立的管道數目

for (i = 0; i < pipe_num; i++)

}for (i = 0; i < cmd_num; i++)

if (pid == 0)

} else if (i==pipe_num)

} else }}

if (cmd[i].in)

if (cmd[i].out)

execvp(cmd[i].ar**[0], cmd[i].ar**); //執行使用者輸入的命令

fprintf(stderr, "executing %s error.\n", cmd[i].ar**[0]);

exit(127);

}/* parent */

for (i = 0; i < pipe_num; i++)

for (i = 0; i < cmd_num; i++)

}}

batch實現互動式問詢

需求 在乙個batch指令碼裡需要使用者確認某個資訊是否正確。如果正確,那麼輸入yes,繼續後面的工作 如果不正確,輸入no,然後提示使用者輸入正確的值,並讀入這個值賦給變數,然後繼續後面的工作 如果輸入既非yes又非no,提示使用者重新輸入yes或no,然後再回到前面的判斷。實現 set var ...

Python 實現互動式執行命令

paramiko提供了ssh 客戶端的介面,讓大家在寫指令碼的時候可以remote到遠端的機器上執行命令 有時候在執行某些命令的時候我們需要輸入一些值,接著才往下跑,下面是乙個簡單的指令碼來解決這個動態輸入的問題 service tomcat status root1234 if retcode 0...

linux中非互動式修改密碼

今天在寫乙個shell指令碼的時候發現需要設定使用者的密碼,而設定密碼是互動式的,這樣在指令碼中顯然是不太好的,因此上網查詢資料,發現了以下兩種常見的非互動式設定密碼的方式 1 使用chpasswd chpasswd其實是通過使用者輸入 使用者名稱 密碼 來更改一組使用者的密碼,還是乙個可以批量修改...