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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 5400 | 回復: 9
打印 上一主題 下一主題

怎么理解shell執(zhí)行命令時是啟用了一個新shell?  關(guān)閉 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2004-09-10 12:10 |只看該作者 |倒序瀏覽
DBNAME是在profile里定義的環(huán)境變量并被export
所以
echo $DBNAME
sbss

但是
$a=1
而不擴展
那么
echo $a
1
為什么這個a變量被傳到子shell了呢

論壇徽章:
0
2 [報告]
發(fā)表于 2004-09-10 13:00 |只看該作者

怎么理解shell執(zhí)行命令時是啟用了一個新shell?


  1. 要設(shè)計一個測試案例是不容易的,F(xiàn)在還沒有想好。
  2. 不過可以給你一點參考

  3. a=b

  4. 首先 type echo 應該是 built-in,當然是在當前的shell運行的。不會啟動子shell。所以沒有傳遞的意思。

  5. which echo,應該有/usr/bin/echo

  6. 好的,現(xiàn)在開始
  7. /usr/bin/echo $a

  8. 這一定會啟動一個子shell來運行的。但是要注意,當前shell啟動shell前,已經(jīng)做了$a的展開,(set -x看看?)。也就是說,實際傳入的命令行為
  9. /usr/bin/echo b
  10. 因此,你看到的還是b,已經(jīng)被當前shell解析$a后的展開式。但是你由此
  11. 作出a也就子shell繼承的推斷是有問題的
復制代碼

論壇徽章:
0
3 [報告]
發(fā)表于 2004-09-10 14:45 |只看該作者

怎么理解shell執(zhí)行命令時是啟用了一個新shell?


  1. 不知道這樣的測試,在您的系統(tǒng)是什么結(jié)果
  2. set -x            為了能看到您的實際輸入

  3. export   var="hello"
  4. avar=" world"
  5. echo "$var" "$avar"
  6. /bin/echo "$var" "$avar"
  7. echo '$var' '$avar'
  8. /bin/echo '$var' '$avar'
  9. eval echo '$var' '$avar'
  10. eval /bin/echo '$var' '$avar'
  11. sh eval echo '$var' '$avar'
  12. sh eval /bin/echo '$var' '$avar'

復制代碼

論壇徽章:
0
4 [報告]
發(fā)表于 2004-09-10 14:48 |只看該作者

怎么理解shell執(zhí)行命令時是啟用了一個新shell?

原帖由 "ivhb" 發(fā)表:

好的,現(xiàn)在開始
/usr/bin/echo $a

這一定會啟動一個子shell來運行的。

  1. [x@as bin]# file echo
  2. echo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
復制代碼

是個shell script 時 ,是在subshell中執(zhí)行的,
echo 是一個二進制的執(zhí)行文件,怎么會在子shell中執(zhí)行呢? 這個echo 還是在當前shell中執(zhí)行阿

論壇徽章:
0
5 [報告]
發(fā)表于 2004-09-10 18:26 |只看該作者

怎么理解shell執(zhí)行命令時是啟用了一個新shell?


  1. 就我所知,執(zhí)行一個二進制文件,一定是exec()來執(zhí)行的。
  2. 如果是當前進程,exec()執(zhí)行完該二進制文件后,還能繼續(xù)運行當前shell么?
復制代碼

論壇徽章:
0
6 [報告]
發(fā)表于 2004-09-10 19:04 |只看該作者

怎么理解shell執(zhí)行命令時是啟用了一個新shell?

執(zhí)行完二進制文件是產(chǎn)生個該二進制文件(程序)的新進程,但不是一個shell進程, 所謂在subshell中執(zhí)行只不過是由subshell產(chǎn)生該程序的進程, 而不是當前shell產(chǎn)生

論壇徽章:
0
7 [報告]
發(fā)表于 2004-09-10 19:49 |只看該作者

怎么理解shell執(zhí)行命令時是啟用了一個新shell?

[code]
當前的shell,如果fork了,那么fork之后,有一份當前shell的完整的copy,這個copy,就認為是子shell,然后子shell就execlp指定的文件。
如果當前shell沒有fork,就是當前shell中執(zhí)行。

執(zhí)行二進制文件里,不fork,exec,那么該二進制文件執(zhí)行完后,一定是
中止了當前的運行環(huán)境。這點應該可以確認的吧。由此我想
我和你的分歧在于,可能是因為父進程fork了,其子進程和本身一樣。所以不能成為子shell??

當前shell一旦fork,能說,fork的進程不是shell?只是fork到exec的動作太快,fork出來的子shell的進程空間立馬被該二進制文件覆蓋。

這是我的理解,還望斧正
[code]

論壇徽章:
0
8 [報告]
發(fā)表于 2004-09-10 20:23 |只看該作者

怎么理解shell執(zhí)行命令時是啟用了一個新shell?

謝謝樓上的兩位大俠:我明白了。
關(guān)鍵在于:shell 進程與普通的命令進程(也算是shell的子進程,單不是子shell進程,兩者的區(qū)別就是子shell進程會擁有父shell進程的環(huán)境變量的副本,而普通的進程沒有,普通的進程就相當于一詞函數(shù)調(diào)用,把我們需要用到的環(huán)境變量等傳遞進去,然后進行操作,很有可能會修改變量的值.)

在命令行執(zhí)行某個命令時,由primary shell fork 一個普通的進程,并傳遞需要的變量(可能時常量,比如一個字符串,也可能時一個已經(jīng)定義了的變量,如環(huán)境變量)。但是執(zhí)行環(huán)境并沒有改變,普通命令進程通primary的一個共同之處就是:共享標準輸入,標準輸出等文件。所以盡管在命令進程里進行屏幕打印等操作我們也能看到)。
而在script中執(zhí)行時,則由primary shell fork 一個sub shell(大概就是primary shell 的copy),所以該sub shell 擁有primary shell 里定義的所有環(huán)境變量,只不過是副本了,所以對環(huán)境變量的修改不會影響到父shell 進程。

所以 :
$echo $a
實際就是在當前shell環(huán)境那執(zhí)行一個普通命令調(diào)用。
$unset a
把a的地址傳遞給unset命令,在unset命令里清除。這與:
$a=""有類似的功效而已。

綜上,所謂shell: 1.充當主進程的角色。
                          2.在其生命期內(nèi)(沒有exit或者log out).維護一些必要的環(huán)境變量,供普通命令進程或者sub shell使用。
以上是我的理解,不對的地方請指出。!
謝謝。

論壇徽章:
0
9 [報告]
發(fā)表于 2004-09-10 20:41 |只看該作者

怎么理解shell執(zhí)行命令時是啟用了一個新shell?

原帖由 "ivhb" 發(fā)表:
當前shell一旦fork,能說,fork的進程不是shell?只是fork到exec的動作太快,fork出來的子shell的進程空間立馬被該二進制文件覆蓋。

當前shell直接就fork 出一個二進制文件的進程, 就不用先fork個subshell再exec了,那是浪費資源
pinecrane說的是正確的

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

怎么理解shell執(zhí)行命令時是啟用了一個新shell?

[quote]原帖由 "compnik"]當前shell直接就fork 出一個二進制文件的進程, 就不用先fork個subshell再exec了,那是浪費資源 [/quote 發(fā)表:

這個我也不確定, 但從眾多文件的說明上, 似乎大都說是先 fork 再 exec 再 exit 的...

a=b
/bin/echo $a
理解上, a 是一個 local var, 不會被帶進 child env 中的.
但為何可以看到呢?
嗯... 看過 shell 十三問的朋友, 一定記得我最少強調(diào)過兩次如下的觀念了:
---> 在 command line 中的變數(shù)替換完成後, 會重組命令行!

因此, /bin/echo $a 在完成替換後, 會被重組為 /bin/echo b ,
然後才 fork & exec ...
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP