欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

linux用戶命令解釋器 shell命令解釋器

【Linux】實(shí)現(xiàn)一個(gè)簡(jiǎn)單的shell命令解釋器

姓名:羅學(xué)元? ? ? ?學(xué)號(hào):21181214375 ????學(xué)院:廣州研究院

目前創(chuàng)新互聯(lián)公司已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、滄源網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

【嵌牛導(dǎo)讀】shell命令解釋器該包含哪些部分

【嵌牛鼻子】shell命令解釋器該包含哪些部分

【嵌牛提問(wèn)】shell命令解釋器該包含哪些部分

我們所做的這個(gè)簡(jiǎn)單的shell命令解釋器可以實(shí)現(xiàn)簡(jiǎn)單的常用的基本命令,如ls、pwd、cd、cd - 、cd ~ 等

根據(jù)簡(jiǎn)單命令的定義,它的第一個(gè)參數(shù)是要執(zhí)行的命令,后面的參數(shù)作為該命令的參數(shù)。

要執(zhí)行的命令有兩種情況:

一種是外部命令: 也就是對(duì)應(yīng)著磁盤上的某個(gè)程序,例如 pwd、ls等等。對(duì)于這種外部命令,我們首先要到指定的路徑下找到它,然后再執(zhí)行它。

另一種是內(nèi)部命令:內(nèi)部命令并不對(duì)應(yīng)磁盤上的程序,例如cd等等,它需要shell自己來(lái)決定該如何執(zhí)行。例如對(duì) cd 命令,shell就應(yīng)該根據(jù)它后面的參數(shù)改變當(dāng)前路徑。

對(duì)于外部命令,需要?jiǎng)?chuàng)建一個(gè)子進(jìn)程來(lái)執(zhí)行它,本質(zhì)就是fork+exec

#include stdio.h

#include stdlib.h

#include assert.h

#include string.h

#include pwd.h

#include sys/utsname.h

#include sys/types.h

#include unistd.h

#define MAX 10

#define STRLEN 128

#define PATH "/bin/" //系統(tǒng)bin路徑位置

char OLDPWD[STRLEN]={0}; //記錄上一次的命令,為了cd -這條命令

//================================================================================

//每次敲回車輸出當(dāng)前所在用戶信息

//普通用戶和root用戶的提示符區(qū)別

void Printf_Info()

{

char flag='$';

struct passwd *pw=getpwuid(getuid());

assert(pw!=NULL);

//uid為0則為root用戶

if(pw-pw_uid==0)

{

flag='#';

}

struct utsname hostname; //主機(jī)名

uname(hostname);

char node[STRLEN]={0};

strcpy(node,hostname.nodename); //獲取網(wǎng)絡(luò)上的名稱

char* name=strtok(node,".");

//獲取絕對(duì)路徑

char path[STRLEN]={0};

getcwd(path,STRLEN-1);

char*p=path+strlen(path); //p指向絕對(duì)路徑的末尾

while(*p!='/')

{

p--;

}

//p指向路徑末尾往前的第一個(gè)‘/’位置處

if(strlen(path)!=1)

{

p++; //++前,p-'/'

}

if(strcmp(path,pw-pw_dir)==0)

{

p="~";

}

printf("\033[;32mMyBash[%s@%s %s]%c\033[0m",pw-pw_name,name,p,flag);

//? \033[47;31mThis is a color test\033[0m? 設(shè)置打印結(jié)果的顏色

fflush(stdout);

}

//================================================================================

void Mycd(char*path)

{

//第一個(gè)字符串為cd而第二為空 如:cd 則結(jié)束本輪循環(huán)

if(path==NULL)

{

exit(0);

}

//cd ~ 回到用戶根目錄

if(strcmp(path,"~")==0)

{

? ? struct passwd*pw=getpwuid(getuid());

? ? path=pw-pw_dir;

}

//cd - 回到上一次的位置

if(strcmp(path,"-")==0)?

{

? //若是第一次輸入命令,則cd -命令不存在!

? ? if(strlen(OLDPWD)==0)

? ? {

? ? ? ? printf("\033[;31mMyBash:cd:OLDPWD not set\n\033[0m");

? ? ? ? return ;

? ? }

? ? //否則把上一次的命令給path

? ? path=OLDPWD;

}

//getpwd記錄當(dāng)前工作目錄的絕對(duì)路徑

char oldpwd[STRLEN]={0};

getcwd(oldpwd,STRLEN-1);

if(-1==chdir(path))//反之則不是空,則通過(guò)chdir系統(tǒng)調(diào)用進(jìn)入到該目錄中

{

? ? char err[128]="\033[;31mMybash: cd \033[0m";

? ? strcat(err,path);

? ? perror(err);

}

//每次執(zhí)行完cd命令后,把工作路徑賦給OLDPWD

strcpy(OLDPWD,oldpwd);

}

//================================================================================

//命令分割函數(shù)

void Strtok_cmd(char*buff,char*myargv[])

{

char *s=strtok(buff," "); //分割輸入的字符串

if(s==NULL) //如果s為空,則進(jìn)入下一輪循環(huán)

{

exit(0);

}

myargv[0]=s; //把分割出來(lái)的第一個(gè)字符串放在myargv[0]中

int i=1;

while((s=strtok(NULL,""))!=NULL) //把后續(xù)分割出來(lái)的字符串依次存放在數(shù)組中

{

myargv[i++]=s;

}

}

//===============================================================

int main()

{

while(1)

{

char buff[128]={0};

Printf_Info();

//從終端獲取命令存入buff中

fgets(buff,128,stdin);

buff[strlen(buff)-1]=0;

char *myargv[MAX]={0};

//分割輸入的命令

Strtok_cmd(buff,myargv);

//如果輸入exit則退出循環(huán)

if(strcmp(myargv[0],"exit")==0)

{

exit(0);

}

//如果分割出來(lái)的第一個(gè)字符串為cd

else if(strcmp(myargv[0],"cd")==0)

{

Mycd(myargv[1]);

continue;

}

//若是系統(tǒng)調(diào)用,直接替換fork+exec

pid_t pid=fork();

assert(pid!=-1);

if(pid==0)

{

char path[256]={0};

if(strncmp(myargv[0],"./",2)!=0 strncmp(myargv[0],"/",1)!=0)

{

//先把路徑放入path中

strcpy(path,PATH);

}

//進(jìn)行命令拼接,路徑+名稱

strcat(path,myargv[0]);

//替換進(jìn)程 例如:/bin/ls

execv(path,myargv);

perror("\033[;31mexecv error\033[0m");

}

//處理僵死進(jìn)程

else

{

wait(NULL);

}

}

}

運(yùn)行結(jié)果如下 :

異常處理如下:

若是第一次運(yùn)行程序,則不能使用cd - 命令,因?yàn)榇藭r(shí)還沒(méi)有歷史路徑

若進(jìn)入一個(gè)不存在的目錄則會(huì)報(bào)錯(cuò),沒(méi)有這個(gè)文件或目錄

若直接輸入一個(gè)不存在的無(wú)法識(shí)別的命令,也會(huì)報(bào)錯(cuò)。

Linux命令解釋器——Shell?

Shell是應(yīng)用于Linux系統(tǒng)中的命令解釋器,其作用和Windows系統(tǒng)的命令提示符一樣。都是為當(dāng)前用戶提供與系統(tǒng)內(nèi)核進(jìn)行交互操作的一種用戶界面。

bash(shell)命令解釋器,Linux界面介紹

Linux bash命令行:bash命令行解釋器或者翻譯官,命令行輸入命令都是由bash解釋執(zhí)行的。

一、命令行

二、查詢當(dāng)前登錄的用戶:

root

三、查詢當(dāng)前用戶主機(jī)名:

oldboy

四、查詢當(dāng)前用戶所在的路徑:

/root

五、切換用戶:

#切換到oldboy用戶

(#$是普通用戶的提示符。一般大臣,布衣。)?

oldboy

六、符號(hào)的意思

~? ? ? ? 用戶家目錄

-? ? ? ? ? 上一次所在的目錄

.? ? ? ? ?表示當(dāng)前目錄

..? ? ? ? ?上一級(jí)目錄

../.. ? ? ?表示上一級(jí)的上一級(jí)目錄

LINUX快速入門第八章:Shell基礎(chǔ)

我們平時(shí)所說(shuō)的 Shell 可以理解為 Linux 系統(tǒng)提供給用戶的使用界面。Shell 為用戶提供了輸入命令和參數(shù)并可得到命令執(zhí)行結(jié)果的環(huán)境。當(dāng)一個(gè)用戶登錄 Linux 之后,系統(tǒng)初始化程序 init 就根據(jù) /etc/passwd 文件中的設(shè)定,為每個(gè)用戶運(yùn)行一個(gè)被稱為 Shell(外殼)的程序。

確切地說(shuō),Shell 是一個(gè)命令行解釋器,它為用戶提供了一個(gè)向 Linux 內(nèi)核發(fā)送請(qǐng)求以便運(yùn)行程序的界面系統(tǒng)級(jí)程序,用戶可以用 Shell 來(lái)啟動(dòng)、掛起、停止甚至編寫一些程序。

Shell 處在內(nèi)核與外層應(yīng)用程序之間,起著協(xié)調(diào)用戶與系統(tǒng)的一致性、在用戶與系統(tǒng)之間進(jìn)行交互的作用。圖 1 是 Linux 系統(tǒng)層次結(jié)構(gòu)圖,Shell 接收用戶輸入的命令,并把用戶的命令從類似 abed 的 ASCII 碼解釋為類似 0101 的機(jī)器語(yǔ)言,然后把命令提交到系統(tǒng)內(nèi)核處理;當(dāng)內(nèi)核處理完畢之后,把處理結(jié)果再通過(guò) Shell 返回給用戶。

換句話說(shuō):

Shell 是一個(gè)用 C 語(yǔ)言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語(yǔ)言,又是一種程序設(shè)計(jì)語(yǔ)言。

Shell 是指一種應(yīng)用程序,這個(gè)應(yīng)用程序提供了一個(gè)界面,用戶通過(guò)這個(gè)界面訪問(wèn)操作系統(tǒng)內(nèi)核的服務(wù)。

Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一個(gè)典型的圖形界面 Shell。

Shell 與其他 Linux 命令一樣,都是實(shí)用程序,但它們之間還是有區(qū)別的。一旦用戶注冊(cè)到系統(tǒng)后,Shell 就被系統(tǒng)裝入內(nèi)存并一直運(yùn)行到用戶退出系統(tǒng)為止;而一般命令僅當(dāng)被調(diào)用時(shí),才由系統(tǒng)裝入內(nèi)存執(zhí)行。

與一般命令相比,Shell 除了是一個(gè)命令行解釋器,同時(shí)還是一門功能強(qiáng)大的編程語(yǔ)言,易編寫,易調(diào)試,靈活性較強(qiáng)。作為一種命令級(jí)語(yǔ)言,Shell 是解釋性的,組合功能很強(qiáng),與操作系統(tǒng)有密切的關(guān)系,可以在 Shell 腳本中直接使用系統(tǒng)命令。大多數(shù) Linux 系統(tǒng)的啟動(dòng)相關(guān)文件(一般在 /etc/rc.d 目錄下)都是使用 Shell 腳本編寫的。

同傳統(tǒng)的編程語(yǔ)言一樣,Shell 提供了很多特性,這些特性可以使 Shell 腳本編程更為有用,如數(shù)據(jù)變量、參數(shù)傳遞、判斷、流程控制、數(shù)據(jù)輸入和輸出、子程序及中斷處理等。

說(shuō)了這么多,其實(shí)我們?cè)?Linux 中操作的命令行界面就是 Linux 的 Shell,也就是 Bash,但是我們的圖形界面是 Shell 嗎?其實(shí)從廣義講,圖形界面當(dāng)然也是 Shell,因?yàn)樗瑯佑脕?lái)接收用戶的操作,并傳遞到內(nèi)核進(jìn)行處理。不過(guò),這里的 Shell 主要指的是 Bash。

Shell 腳本

Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。

業(yè)界所說(shuō)的 shell 通常都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個(gè)不同的概念。

由于習(xí)慣的原因,簡(jiǎn)潔起見(jiàn),本文出現(xiàn)的 "shell編程" 都是指 shell 腳本編程,不是指開(kāi)發(fā) shell 自身。

Shell的分類

目前 Shell 的版本有很多種,如 Bourne Shell、C Shell、Bash、ksh、tcsh 等,它們各有特點(diǎn),下面簡(jiǎn)要介紹一下。

最重要的 Shell 是 Bourne Shell,這個(gè)命名是為了紀(jì)念此 Shell 的發(fā)明者 Steven Bourne。從 1979 年起,UNIX 就開(kāi)始使用 Boume Shell。Bourne Shell 的主文件名為 sh,開(kāi)發(fā)人員便以 sh 作為 Bourne Shell 的主要識(shí)別名稱。

雖然 Linux 與 UNIX 一樣,可以支持多種 Shell,但 Boume Shell 的重要地位至今仍然沒(méi)有改變,許多 UNIX 系統(tǒng)中仍然使用 sh 作為重要的管理工具。它的工作從開(kāi)機(jī)到關(guān)機(jī),幾乎無(wú)所不包。在 Linux 中,用戶 Shell 主要是 Bash,但在啟動(dòng)腳本、編輯等很多工作中仍然使用 Bourne Shell。

C Shell 是廣為流行的 Shell 變種。C Shell 主要在 BSD 版的 UNIX 系統(tǒng)中使用,發(fā)明者是柏克萊大學(xué)的 Bill Joy。C Shell 因?yàn)槠湔Z(yǔ)法和 C 語(yǔ)言類似而得名,這也使得 UNIX 的系統(tǒng)工程師在學(xué)習(xí) C Shell 時(shí)感到相當(dāng)方便。

Bourne Shell 和 C Shell 形成了 Shell 的兩大主流派別,后來(lái)的變種大都吸取這兩種 Shell 的特點(diǎn),如 Korn、 tcsh 及 Bash。

Bash Shell 是 GNU 計(jì)劃的重要工具之一,也是 GNU 系統(tǒng)中標(biāo)準(zhǔn)的 Shell。Bash 與 sh 兼容,所以許多早期開(kāi)發(fā)出來(lái)的 Bourne Shell 程序都可以繼續(xù)在 Bash 中運(yùn)行。現(xiàn)在使用的 Linux 就使用 Bash 作為用戶的基本 Shell。

Bash 于 1988 年發(fā)布,并在 1995-1996年推出Bash 2.0。在這之前,廣為使用的版本是1.14,Bash 2.0增加了許多新的功能,以及具備更好的兼容性。表 2 中詳細(xì)列出了各版本的具體情況。

注意,Shell 的兩種主要語(yǔ)法類型有 Bourne 和 C,這兩種語(yǔ)法彼此不兼容。Boume 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括 csh、tcsh(Bash 和 zsh 在不同程序上支持 csh 的語(yǔ)法)。

本章講述的腳本編程就是在 Bash 環(huán)境中進(jìn)行的。不過(guò),在 Linux 中除了可以支持 Bash,還可以支持很多其他的 Shell。我們可以通過(guò) /etc/shells 文件來(lái)査詢 Linux 支持的 Shell。命令如下:

在 Linux 中,這些 Shell 是可以任意切換的,命令如下:

用戶信息文件 /etc/passwd 的最后一列就是這個(gè)用戶的登錄 Shell。命令如下:

大家可以看到,root 用戶和其他可以登錄系統(tǒng)的普通用戶的登錄 Shell 都是 /bin/bash,也就是 Linux 的標(biāo)準(zhǔn) Shell,所以這些用戶登錄之后可以執(zhí)行權(quán)限允許范圍內(nèi)的所有命令。不過(guò),所有的系統(tǒng)用戶(偽用戶)因?yàn)榈卿?Shell 是 /sbin/ndogin,所以不能登錄系統(tǒng)。

筆記:

sh/bash/csh/Tcsh/ksh/pdksh等shell的區(qū)別

Linux的命令行界面

Linux操作和Windows有很大不同。要熟練的使用Linux系統(tǒng),首先要了解Linux系統(tǒng)的目錄結(jié)構(gòu),并掌握常用的命令,以便進(jìn)行文件的操作、信息查看和系統(tǒng)參數(shù)配置等。接下來(lái)是我為大家收集的Linux的命令行界面,歡迎大家閱讀:

Linux的命令行界面

命令行模式

在Linux中我們很少使用圖形模式,為什么呢?因?yàn)榇笊癫恍肌!!(∩_∩)O~一般斗門都是用命令行模式來(lái)進(jìn)行各種操作,因?yàn)槊钚心J綀?zhí)行速度快,而且穩(wěn)定性高。而Linux中的命令解釋器就是Shell,這也是在使用命令前必須要了解Shell的原因。

為什么要先學(xué)習(xí)Shell

Linux系統(tǒng)主要由四大部分組成:

vcWxvtPv0dSx4LPMu7e+s6Ost72x49PDu6fN6rPJvPK1pbW9uLTU07XEyM7O8bX3tsihow0KPHA+TGludXjG9LavyrGjrNfuz8i9+MjrxNq05rXEysfE2rrLo6yyorOj16TE2rTmo6zIu7rzvfjQ0M+1zbPS/bW8o6zS/bW8tcS5/bPM1tDG9Lavy/nT0L340NC1xLi4vfizzNTauvPMqNTL0NCjrNaxtb3P4LnYtcTPtc2z18rUtLP1yry7r83qsc+686Ostci0/dPDu6e1x8K8oaPTw7untcfCvMqxo6zNqLn9tcfCvL34s8zR6dak08O7p7XEus+3qNDUoaPTw7un0enWpM2ouf2687j5vt3Tw7untcTJ6NbDxvS2r8/gudi1xFNoZWxso6zS1LHjvdPK1dPDu6fK5MjrtcTD/MHusqK3tbvY1rTQ0L3hufuhozwvcD4NCjxwPtPDu6fWtNDQ0ru49sP8we61xLn9s8yjujwvcD4NCjxzdmcgaGVpZ2h0PQ=="256" version="1.1" width="336.28125" xmlns=""Created with Rapha?l 2.1.0用戶用戶命令解釋器Shell命令解釋器Shell 操作系統(tǒng) 操作系統(tǒng)命令結(jié)果

Linux的Shell有很多種,bash(Bourne Again Shell)是使用最廣泛的一種,各個(gè)發(fā)行版一般將其設(shè)置為系統(tǒng)中默認(rèn)的Shell。許多Linux系統(tǒng)將Shell作為重要的系統(tǒng)管理工具,比如:系統(tǒng)的開(kāi)機(jī)、關(guān)機(jī)及軟件的管理。其他的Shell有:C Shell、Korn Shell、Bourne Shell等,其中C Shell主要因?yàn)槠湔Z(yǔ)法和C語(yǔ)言類似而得名,而B(niǎo)ourne Again Shell是Bourne Shell的擴(kuò)展。

Linux提供的圖形界面接口可以完成絕大多數(shù)的工作,而系統(tǒng)管理員一般更習(xí)慣于使用終端命令行進(jìn)行系統(tǒng)的參數(shù)設(shè)置和任務(wù)管理。使用終端命令行可以方便快速地完成各種任務(wù)。

使用終端命令行需要掌握一些必要的命令,這些命令的組合不僅可以完成簡(jiǎn)單的操作,通過(guò)Linux提供的Shell還可以完成一些復(fù)雜的任務(wù)。用戶在終端命令行輸入一串字符,Shell負(fù)責(zé)理解并執(zhí)行這些字符串。然后把結(jié)果顯示在終端上。

注意:大多數(shù)Shell都有命令補(bǔ)齊的功能。

在Unix的發(fā)展歷史上,用戶都是通過(guò)Shell來(lái)工作的。大部分命令都經(jīng)過(guò)了幾十年的發(fā)展和改良,功能強(qiáng)大,性能穩(wěn)定。Linux繼承自Unix,自然也是如此。此外Linux的圖形化界面并不好,并不是所有的命令都有對(duì)應(yīng)的圖形按鈕。在圖形化界面崩潰的情況下,就更要靠Shell輸入命令來(lái)恢復(fù)計(jì)算機(jī)了。

命令本身是一個(gè)函數(shù)(function),是一個(gè)小的功能模塊。如果想要讓計(jì)算機(jī)完成很復(fù)雜的事情,則必須通過(guò)Shell編程來(lái)實(shí)現(xiàn)。可以把命令作為函數(shù),嵌入到Shell程序中,從而讓不同的命令協(xié)同工作。

如何進(jìn)入命令行

如果安裝的是桌面版,有兩種方式進(jìn)入命令行界面:菜單方式、快捷鍵方式。

菜單方式

菜單方式常用的有兩種:

單擊鼠標(biāo)右鍵,選擇【在終端中打開(kāi)】。

單擊【應(yīng)用程序】-【工具】-【終端】,打開(kāi)命令行。

虛擬機(jī)上,再多一個(gè)Shift鍵,使用Ctrl+Shift+Alt+F1的形式。在CentOS桌面版中,我測(cè)試這幾個(gè)按鍵都無(wú)效,這里要使用Ctrl+Windows鍵+Alt+F3切換到命令行,在使用Ctrl+Windows鍵+Alt+F1切回圖形界面。

注意:因?yàn)樘摂M機(jī)默認(rèn)與主機(jī)之間的切換快捷鍵是Ctrl+Alt鍵,所以在使用有這兩個(gè)鍵的快捷操作時(shí),盡量不要先按這兩個(gè)鍵,否則就會(huì)跳出虛擬機(jī)模式。

看了“Linux的命令行界面”還想看:

1. LINUX圖形界面下如何快速切換到命令界面

2. 怎么進(jìn)入CMD命令行界面

3. 如何打開(kāi)命令行窗口的快速編輯功能

4. win7怎么打開(kāi)DOS命令行窗口

5. 炫酷的Linux終端命令大全

名稱欄目:linux用戶命令解釋器 shell命令解釋器
當(dāng)前地址:http://www.chinadenli.net/article46/dooipeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)公司網(wǎng)站制作網(wǎng)頁(yè)設(shè)計(jì)公司用戶體驗(yàn)外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)