亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
打印 上一主題 下一主題

[學(xué)習(xí)共享] shell 十三問? [復(fù)制鏈接]

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
51 [報(bào)告]
發(fā)表于 2004-01-01 01:20 |只看該作者

shell 十三問?

我倒覺得沒甚麼變種不變種的....
反過來,我是否說帶 : 是沒 : 的變種呢?
總之,仔細(xì)區(qū)分每一種不同的情況及替換運(yùn)用,這才是重要的....

p.s.
再囉唆一下:
下次做練習(xí),請(qǐng)不要用 root 帳號(hào)﹗慎記慎記~~~

論壇徽章:
0
52 [報(bào)告]
發(fā)表于 2004-01-03 21:23 |只看該作者

shell 十三問?

這么多好東西,真想一口吃完,又怕消化不了.呵呵~~
網(wǎng)中人老師,可真辛苦您了!

論壇徽章:
0
53 [報(bào)告]
發(fā)表于 2004-01-04 03:05 |只看該作者

shell 十三問?

A=B
B=$A
這樣,B 的變量值就可繼承 A 變量"當(dāng)時(shí)"的變量值了
這段文字我看不太懂,,網(wǎng)中人可不可以再詳解一下,特別是"當(dāng)時(shí)"指的是什么

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
54 [報(bào)告]
發(fā)表于 2004-01-04 22:11 |只看該作者

shell 十三問?

B=$A 是在 command line 中完成的。
請(qǐng)別忘了我一再強(qiáng)調(diào)的如下文字:
若從技術(shù)細(xì)節(jié)來看,shell 會(huì)依據(jù) IFS(Internal Field Seperator) 將 command line 所輸入的文字給拆解為"字段"(word)。
然後再針對(duì)特殊字符(meta)先作處理,最後再重組整行 command line 。


也就是 command line 碰到 $A 時(shí),會(huì)先提換出 $A 的值(當(dāng)時(shí)的值),也就是 B 。
於是,B=$A 就是 B=B 了...

論壇徽章:
0
55 [報(bào)告]
發(fā)表于 2004-01-05 19:37 |只看該作者

shell 十三問?

原來這么簡(jiǎn)單啊!謝謝網(wǎng)中人的指點(diǎn)了.

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
56 [報(bào)告]
發(fā)表于 2004-01-06 01:22 |只看該作者

shell 十三問?

6) exec 跟 source 差在哪?

這次先讓我們從 CU Shell 版的一個(gè)實(shí)例貼子來談起吧:
(論壇改版後原連結(jié)已經(jīng)失效 )

例中的提問原文如下:
cd /etc/aa/bb/cc可以執(zhí)行
但是把這條命令寫入shell時(shí)shell不執(zhí)行!
這是什么原因呀!

(意思是:運(yùn)行腳本後并沒有移到 /etc/aa/bb/cc 目錄)

我當(dāng)時(shí)如何回答暫時(shí)別去深究,先讓我們了解一下行程(process)的觀念好了。
首先,我們所執(zhí)行的任何程式,都是由父行程(parent process)所產(chǎn)生出來的一個(gè)子行程(child process),
子行程在結(jié)束後,將返回到父行程去。此一現(xiàn)像在 Linux 系統(tǒng)中被稱為  fork 。
(為何要程為 fork 呢?嗯,畫一下圖或許比較好理解...  ^_^ )
當(dāng)子行程被產(chǎn)生的時(shí)候,將會(huì)從父行程那裡獲得一定的資源分配、及(更重要的是)繼承父行程的環(huán)境﹗
讓我們回到上一章所談到的"環(huán)境變量"吧:
* 所謂環(huán)境變量其實(shí)就是那些會(huì)傳給子行程的變量。
簡(jiǎn)單而言,"遺傳性"就是區(qū)分本地變量與環(huán)境變量的決定性指標(biāo)。
然而,從遺傳的角度來看,我們也不難發(fā)現(xiàn)環(huán)境變量的另一個(gè)重要特徵:
* 環(huán)境變量只能從父行程到子行程單向繼承。換句話說:在子行程中的環(huán)境如何變更,均不會(huì)影響父行程的環(huán)境。

接下來,再讓我們了解一下命令腳本(shell script)的概念。
所謂的 shell script 講起來很簡(jiǎn)單,就是將你平時(shí)在 shell prompt 後所輸入的多行 command line 依序?qū)懭胍粋(gè)文件去而已。
其中再加上一些條件判斷、互動(dòng)界面、參數(shù)運(yùn)用、函數(shù)調(diào)用等等技巧,得以讓 script 更加"聰明"的執(zhí)行,
但若撇開這些技巧不談,我們真的可以簡(jiǎn)單的看成 script 只不過依次執(zhí)行預(yù)先寫好的命令行而已。

再結(jié)合以上兩個(gè)概念(process + script),那應(yīng)該就不難理解如下這句話的意思了:
* 正常來說,當(dāng)我們執(zhí)行一個(gè) shell script 時(shí),其實(shí)是先產(chǎn)生一個(gè) sub-shell 的子行程,然後 sub-shell 再去產(chǎn)生命令行的子行程。
然則,那讓我們回到本章開始時(shí)所提到的例子再從新思考:
cd /etc/aa/bb/cc可以執(zhí)行
但是把這條命令寫入shell時(shí)shell不執(zhí)行!
這是什么原因呀!


我當(dāng)時(shí)的答案是這樣的:
因?yàn)椋话阄覀兣艿?shell script 是用 subshell 去執(zhí)行的。
從 process 的觀念來看,是 parent process 產(chǎn)生一個(gè) child process 去執(zhí)行,
當(dāng) child 結(jié)束後,會(huì)返回 parent ,但 parent 的環(huán)境是不會(huì)因 child 的改變而改變的。
所謂的環(huán)境元數(shù)很多,凡舉 effective id, variable, workding dir 等等...
其中的 workding dir ($PWD) 正是樓主的疑問所在:
當(dāng)用 subshell 來跑 script 的話,sub shell 的 $PWD 會(huì)因?yàn)?cd 而變更,
但當(dāng)返回 primary shell 時(shí),$PWD 是不會(huì)變更的。


能夠了解問題的原因及其原理是很好的,但是?如何解決問題恐怕是我們更感興趣的﹗是吧?^_^
那好,接下來,再讓我們了解一下 source 命令好了。
當(dāng)你有了 fork 的概念之後,要理解 source 就不難:
* 所謂 source 就是讓 script 在當(dāng)前 shell 內(nèi)執(zhí)行、而不是產(chǎn)生一個(gè) sub-shell 來執(zhí)行。
由於所有執(zhí)行結(jié)果均於當(dāng)前 shell 內(nèi)完成,若 script 的環(huán)境有所改變,當(dāng)然也會(huì)改變當(dāng)前環(huán)境了﹗
因此,只要我們將原本單獨(dú)輸入的 script 命令行變成 source 命令的參數(shù),就可輕易解決前例提到的問題了。
比方說,原本我們是如此執(zhí)行  script 的:
  1. ./my.script
復(fù)制代碼

現(xiàn)在改成這樣即可:
  1. source ./my.script
  2. 或:
  3. . ./my.script
復(fù)制代碼


說到這裡,我想,各位有興趣看看 /etc 底下的眾多設(shè)定文件,
應(yīng)該不難理解它們被定議後,如何讓其他 script 讀取並繼承了吧?
若然,日後你有機(jī)會(huì)寫自己的 script ,應(yīng)也不難專門指定一個(gè)設(shè)定文件以供不同的 script 一起"共用"了...  ^_^

okay,到這裡,若你搞得懂 fork 與 source 的不同,那接下來再接受一個(gè)挑戰(zhàn):
---- 那 exec 又與 source/fork 有何不同呢?
哦... 要了解 exec 或許較為複雜,尤其扯上 File Descriptor 的話...
不過,簡(jiǎn)單來說:
* exec 也是讓 script 在同一個(gè)行程上執(zhí)行,但是原有行程則被結(jié)束了。
也就是簡(jiǎn)而言之:原有行程會(huì)否終止,就是 exec 與 source/fork 的最大差異了。

嗯,光是從理論去理解,或許沒那麼好消化,不如動(dòng)手"實(shí)作+思考"來的印象深刻哦。
下面讓我們寫兩個(gè)簡(jiǎn)單的 script ,分別命名為 1.sh 及 2.sh :

1.sh

  1. #!/bin/bash
  2. A=B
  3. echo "PID for 1.sh before exec/source/fork:$$"
  4. export A
  5. echo "1.sh: \$A is $A"
  6. case $1 in
  7.         exec)
  8.                 echo "using exec..."
  9.                 exec ./2.sh ;;
  10.         source)
  11.                 echo "using source..."
  12.                 . ./2.sh ;;
  13.         *)
  14.                 echo "using fork by default..."
  15.                 ./2.sh ;;
  16. esac
  17. echo "PID for 1.sh after exec/source/fork:$$"
  18. echo "1.sh: \$A is $A"
復(fù)制代碼


2.sh

  1. #!/bin/bash
  2. echo "PID for 2.sh: $$"
  3. echo "2.sh get \$A=$A from 1.sh"
  4. A=C
  5. export A
  6. echo "2.sh: \$A is $A"
復(fù)制代碼


然後,分別跑如下參數(shù)來觀察結(jié)果:

  1. $ ./1.sh fork
  2. $ ./1.sh source
  3. $ ./1.sh exec
復(fù)制代碼


或是,你也可以參考 CU 上的另一貼子:
http://www.chinaunix.net/forum/viewtopic.php?t=191051

好了,別忘了仔細(xì)比較輸出結(jié)果的不同及背後的原因哦...
若有疑問,歡迎提出來一起討論討論~~~

happy scripting! ^_^

[ 本帖最后由 網(wǎng)中人 于 2008-10-30 02:17 編輯 ]

論壇徽章:
0
57 [報(bào)告]
發(fā)表于 2004-01-06 10:34 |只看該作者

shell 十三問?

綱中人版主可不可以說說var=${str=expr}怎么理解啊!
對(duì)于
str=
var=${str=expr}
我的理解是先賦給str空值,然后再用str=expr這個(gè)語句來把空值用expr替代!所以我認(rèn)為
echo $str和echo $var也都應(yīng)該是expr.

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
58 [報(bào)告]
發(fā)表于 2004-01-06 12:17 |只看該作者

shell 十三問?

原帖由 "lzblzb" 發(fā)表:
綱中人版主可不可以說說var=${str=expr}怎么理解啊!
對(duì)于
str=
var=${str=expr}
我的理解是先賦給str空值,然后再用str=expr這個(gè)語句來把空值用expr替代!所以我認(rèn)為
echo $str和echo $var也都應(yīng)該是expr.

嗯,這個(gè)前面已經(jīng)討論過了,我不再重複了...

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
59 [報(bào)告]
發(fā)表于 2004-01-08 09:11 |只看該作者

shell 十三問?

7) ( ) 與 { } 差在哪?

嗯,這次輕鬆一下,不講太多...  ^_^

先說一下,為何要用 ( ) 或 { } 好了。
許多時(shí)候,我們?cè)?shell 操作上,需要在一定條件下一次執(zhí)行多個(gè)命令,
也就是說,要麼不執(zhí)行,要麼就全執(zhí)行,而不是每次依序的判斷是否要執(zhí)行下一個(gè)命令。
或是,需要從一些命令執(zhí)行優(yōu)先次順中得到豁免,如算術(shù)的 2*(3+4) 那樣...
這時(shí)候,我們就可引入"命令群組"(command group)的概念:將多個(gè)命令集中處理。

在 shell command line 中,一般人或許不太計(jì)較 ( ) 與 { } 這兩對(duì)符號(hào)的差異,
雖然兩者都可將多個(gè)命令作群組化處理,但若從技術(shù)細(xì)節(jié)上,卻是很不一樣的:
( ) 將 command group 置於 sub-shell 去執(zhí)行,也稱 nested sub-shell。
{ } 則是在同一個(gè) shell 內(nèi)完成,也稱為 non-named command group。
若,你對(duì)上一章的 fork 與 source 的概念還記得了的話,那就不難理解兩者的差異了。
要是在 command group 中扯上變量及其他環(huán)境的修改,我們可以根據(jù)不同的需求來使用 ( ) 或 { } 。
通常而言,若所作的修改是臨時(shí)的,且不想影響原有或以後的設(shè)定,那我們就 nested sub-shell ,
反之,則用 non-named command group 。

是的,光從 command line 來看,( ) 與 { } 的差別就講完了,夠輕鬆吧~~~  ^_^
然而,若這兩個(gè) meta 用在其他 command meta 或領(lǐng)域中(如 Regular Expression),還是有很多差別的。
只是,我不打算再去說明了,留給讀者自己慢慢發(fā)掘好了...
我這裡只想補(bǔ)充一個(gè)概念,就是 function 。
所謂的 function ,就是用一個(gè)名字去命名一個(gè)  command group ,然後再調(diào)用這個(gè)名字去執(zhí)行 command group 。
從 non-named command group 來推斷,大概你也可以猜到我要說的是 { } 了吧?(yes! 你真聰明﹗  ^_^ )

在 bash 中,function 的定義方式有兩種:
方式一:
  1. function function_name {
  2.     command1
  3.     command2
  4.     command3
  5.     ....
  6. }
復(fù)制代碼

方式二:
  1. fuction_name () {
  2.     command1
  3.     command2
  4.     command3
  5.     ....
  6. }
復(fù)制代碼

用哪一種方式無所謂,只是若碰到所定意的名稱與現(xiàn)有的命令或別名(Alias)衝突的話,方式二或許會(huì)失敗。
但方式二起碼可以少打 function 這一串英文字母,對(duì)懶人來說(如我),又何樂不為呢?...  ^_^

function 在某一程度來說,也可稱為"函式",但請(qǐng)不要與傳統(tǒng)編程所使用的函式(library)搞混了,畢竟兩者差異很大。
惟一相同的是,我們都可以隨時(shí)用"已定義的名稱"來調(diào)用它們...
若我們?cè)?shell 操作中,需要不斷的重覆質(zhì)行某些命令,我們首先想到的,或許是將命令寫成命令稿(shell script)。
不過,我們也可以寫成 function ,然後在 command line 中打上 function_name 就可當(dāng)一舨的 script 來使用了。
只是若你在 shell 中定義的 function ,除了可用 unset function_name 取消外,一旦退出 shell ,function 也跟著取消。
然而,在 script 中使用 function 卻有許多好處,除了可以提高整體 script 的執(zhí)行效能外(因?yàn)橐驯惠d入),
還可以節(jié)省許多重覆的代碼...

簡(jiǎn)單而言,若你會(huì)將多個(gè)命令寫成 script 以供調(diào)用的話,那,你可以將 function 看成是 script 中的 script ...  ^_^
而且,透過上一章介紹的 source 命令,我們可以自行定義許許多多好用的 function ,再集中寫在特定文件中,
然後,在其他的 script 中用 source 將它們載入並反覆執(zhí)行。
若你是 RedHat Linux 的使用者,或許,已經(jīng)猜得出 /etc/rc.d/init.d/functions 這個(gè)文件是作啥用的了~~~  ^_^

okay,說要輕鬆點(diǎn)的嘛,那這次就暫時(shí)寫到這吧。祝大家學(xué)習(xí)愉快﹗  ^_^

論壇徽章:
0
60 [報(bào)告]
發(fā)表于 2004-01-08 17:33 |只看該作者

shell 十三問?

真是不錯(cuò)!!
夠我咀嚼好幾天的了。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP