實現簡單的互動式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其實是通過使用者輸入 使用者名稱 密碼 來更改一組使用者的密碼,還是乙個可以批量修改...