免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 網中人
打印 上一主题 下一主题

[学习共享] shell 十三問? [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
11 [报告]
发表于 2003-12-09 14:12 |只看该作者

shell 十三問?

1) 為何叫做 shell ?

在介紹 shell 是甚麼東西之前,不妨讓我們重新檢視使用者與電腦系統的關係:
        圖(FIXME)

我們知道電腦的運作不能離開硬體,但使用者卻無法直接對硬體作驅動,
硬體的驅動只能透過一個稱為"作業系統(Operating System)"的軟體來控管,
事實上,我們每天所談的 linux ,嚴格來說只是一個作業系統,我們稱之為"核心(kernel)"。
然而,從使用者的角度來說,使用者也沒辦法直接操作 kernel ,
而是透過 kernel 的"外殼"程式,也就是所謂的 shell ,來與 kernel 溝通。
這也正是 kernel 跟 shell 的形像命名關係。如圖:
                圖(FIXME)

從技術角度來說,shell 是一個使用者與系統的互動界面(interface),
主要是讓使用者透過命令行(command line)來使用系統以完成工作。
因此,shell 的最簡單的定義就是---命令解譯器(Command Interpreter):
        * 將使用者的命令翻譯給核心處理,
        * 同時,將核心處理結果翻譯給使用者。

每次當我們完成系統登入(log in),我們就取得一個互動模式的 shell ,也稱為 login shell 或 primary shell。
若從行程(process)角度來說,我們在 shell 所下達的命令,均是 shell 所產生的子行程。這現像,我們暫可稱之為 fork 。
如果是執行腳本(shell script)的話,腳本中的命令則是由另外一個非互動模式的子 shell (sub shell)來執行的。
也就是 primary shell 產生 sub shell 的行程,sub shell 再產生 script 中所有命令的行程。
(關於行程,我們日後有機會再補充。)

這裡,我們必須知道:kernel 與 shell 是不同的兩套軟體,而且都是可以被替換的:
        * 不同的作業系統使用不同的 kernel ,
        * 而在同一個 kernel 之上,也可使用不同的 shell 。
在 linux 的預設系統中,通常都可以找到好幾種不同的 shell ,且通常會被列於如下檔案裡:
        /etc/shells
不同的 shell 有著不同的功能,且也彼此各異、或說"大同小異"。
常見的 shell 主要分為兩大主流:
        sh:
                burne shell (sh)
                burne again shell (bash)
        csh:
                c shell (csh)
                tc shell (tcsh)
                korn shell (ksh)
        (FIXME)

大部份的 Linux 系統的預設 shell 都是 bash ,其原因大致如下兩點:
        * 自由軟體
        * 功能強大
bash 是 gnu project 最成功的產品之一,自推出以來深受廣大 Unix 用戶喜愛,
且也逐漸成為不少組織的系統標準。

论坛徽章:
0
12 [报告]
发表于 2003-12-09 19:07 |只看该作者

shell 十三問?

台湾!看来领先我们的技术太多了。佩服!!!
大家努力答答看。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
13 [报告]
发表于 2003-12-09 23:15 |只看该作者

shell 十三問?

关于{}和()
1.{} 的用法
确认你有一个叫file和一个叫file1的变量。能够使用以下的语句给它们赋值:
$ file=this
$ file1=that
$echo $fileand$file1 寻找变量fileand,file1
sh: fileand: parameter not set
$ echo ${file} and $file1 寻找变量file,file1
thisandthat
花括号被用来区分变量名和周围的文本
2.()的用法
命令替代
语法:
$(command)
例子:
$pwd
/home/user2
$ curdir=$(pwd)
$ echo $curdir
/home/user2
$ cd /tmp
$ pwd
$ cd $curdir
$ pwd
/home/user2
命令替代用来替代一个命令和命令行输出。命令替代的标准语法,也是POSIX鼓励的一种语法是:$(command).
命令替代让你捕获一个命令的输出,用它作为另一个命令的参数,或是赋值给一个变量。象在变量替代中一样,命令替代的执行是在命令行开始之前完成的。当命令行输出包含回车换行,它们会被空格代替。
同变量替代相似,命令替代使用一个美元符号之后的用括号包围的一个命令。
所有有效的shell脚本都可以加入命令替代。Shell 扫描每行脚本,执行它发现的开始于一个开括号,结束与于一个闭括号的命令。
命令替代的另外一种格式是用反引号来环绕一个命令象:
`command`
它和$(command) 是等价的,并且这是Bourne Shell认证的唯一的形式。`command`形式可以用在POSIX的脚本中和Bourne Shell的脚本中。
命令替代通常是在将一个命令的输出赋给一个变量或以后的处理时使用。通常pwd命令将它的输出送到你的屏幕。当你执行以下的赋值语句:
$ curdir=$(pwd) 或 $ curdir=`pwd`
pwd 的输出被赋给变量 curdir。

论坛徽章:
0
14 [报告]
发表于 2003-12-10 22:22 |只看该作者

shell 十三問?

以前接触了一些台湾/香港软件和技术人员
其实并不是他们技术首先问题
而是他们很务实,简洁,而且最重要是应用得很适当,就是把一个简单的东西发挥它最大的用处

我最佩服他们这方面的思想

论坛徽章:
0
15 [报告]
发表于 2003-12-11 09:35 |只看该作者

shell 十三問?

出不了力,为你们支持一下。

论坛徽章:
0
16 [报告]
发表于 2003-12-11 14:55 |只看该作者

shell 十三問?

[quote="高山流云"][/quote]
我用了set在cshell里给变量赋值怎么不成功呀,我是小菜,大家多帮忙

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
17 [报告]
发表于 2003-12-11 17:30 |只看该作者

shell 十三問?

原帖由 "config t" 发表:
以前接触了一些台湾/香港软件和技术人员
其实并不是他们技术首先问题
而是他们很务实,简洁,而且最重要是应用得很适当,就是把一个简单的东西发挥它最大的用处

我最佩服他们这方面的思想


怎麼我在台灣的感覺剛好相反呢?  ^_^

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
18 [报告]
发表于 2003-12-12 02:55 |只看该作者

shell 十三問?

2) shell prompt(PS1) 與 Carriage Return(CR) 的關係?

當你成功登錄進一個文字界面之後,大部份情形下,
你會在熒幕上看到一個不斷閃爍的方塊或底線(視不同版本而別),
我們稱之為*遊標*(cursor)。
遊標的作用就是告訴你接下來你從鍵盤輸入的按鍵所插入的位置,
且每輸入一鍵遊標便向右邊移動一個格子,若連續輸入太多的話,則自動接在下一行輸入。

假如你剛完成登錄還沒輸入任何按鍵之前,你所看到的遊標所在位置的同一行的左邊部份,
我們稱之為*提示符號*(prompt)。
提示符號的格式或因不同系統版本而各有不同,在 Linux 上,只需留意最接近遊標的一個可見的提示符號,通常是如下兩者之一:
        $:給一般使用者帳號使用
        #:給 root (管理員)帳號使用

事實上,shell prompt 的意思很簡單:
        * 是 shell 告訴使用者:您現在可以輸入命令行了。
我們可以說,使用者只有在得到 shell prompt 才能打命令行,
而 cursor 是指示鍵盤在命令行所輸入的位置,使用者每輸入一個鍵,cursor 就往後移動一格,
直到碰到命令行讀進 CR(Carriage Return,由 Enter 鍵產生)字符為止。
CR 的意思也很簡單:
        * 是使用者告訴 shell:老兄你可以執行我的命令行了。
嚴格來說:
        * 所謂的命令行,就是在 shell prompt 與 CR 字符之間所輸入的文字。
        (思考:為何我們這裡堅持使用 CR 字符而不說 Enter 鍵呢?答案在後面的學習中揭曉。)

不同的命令可接受的命令行格式或有不同,一般情況下,一個標準的命令行格式為如下所列:
        command-name options argument

若從技術細節來看,shell 會依據 IFS(Internal Field Seperator) 將 command line 所輸入的文字給拆解為"字段"(word)。
然後再針對特殊字符(meta)先作處理,最後再重組整行 command line 。
(注意:請務必理解上兩句話的意思,我們日後的學習中會常回到這裡思考。)

其中的 IFS 是 shell 預設使用的欄位分隔符號,可以由一個及多個如下按鍵組成:
        * 空白鍵(White Space)
        * 表格鍵(Tab)
        * 回車鍵(Enter)

系統可接受的命令名稱(command-name)可以從如下途逕獲得:
        * 明確路逕所指定的外部命令
        * 命令別名(alias)
        * 自定功能(function)
        * shell 內建命令(built-in)
        * $PATH 之下的外部命令
每一個命令行均必需含用命令名稱,這是不能缺少的。

[ 本帖最后由 網中人 于 2008-10-30 02:05 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2003-12-12 09:08 |只看该作者

shell 十三問?

说得好,请继续!

论坛徽章:
0
20 [报告]
发表于 2003-12-12 10:50 |只看该作者

shell 十三問?

顶   
看来买书学习这条法子是不行的了  
书只能领你入门   
要想登堂入室还要多在论坛上混啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP