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

  免費注冊 查看新帖 |

Chinaunix

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

管道 無法改變變量值 的問題 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-09-09 11:20 |只看該作者 |倒序瀏覽
wqfhenanxc@ubuntu:~$ cat test.sh
#!/bin/bash
Lines=0
cat $0 | while read line
do
  ((Lines++))
done
echo "Number of lines read is: $Lines"
exit 0
wqfhenanxc@ubuntu:~$ ./test.sh
Number of lines read is: 0

wqfhenanxc@ubuntu:~$ cat test.sh
#!/bin/bash
Lines=0
while read line
do
  ((Lines++))
done <$0
echo "Number of lines read is: $Lines"
exit 0
wqfhenanxc@ubuntu:~$ ./test.sh
Number of lines read is: 8

上面兩個腳本一個使用了管道來讀文件,一個使用了重定向來讀。
結(jié)果為什么不一樣呢?
請大家從腳本執(zhí)行的本質(zhì)上來給一下解答。

背景知識:
1.當我在命令行中輸入./test.sh時,當前shell創(chuàng)建子shell。
   子shell讀取test.sh中的命令,對于每一行命令,都先調(diào)用fork再調(diào)用exec。

2.對于管道,子shell先創(chuàng)建管道描述符,然后再fork出管道兩邊的兩個子進程,讓后將一個子進程的輸出重定向給另一個子進程的輸入。

論壇徽章:
16
IT運維版塊每日發(fā)帖之星
日期:2015-08-24 06:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-10-14 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-10-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-11-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT運維版塊每日發(fā)帖之星
日期:2016-04-15 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-21 06:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2016-08-16 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運維版塊每日發(fā)帖之星
日期:2015-08-14 06:20:00
2 [報告]
發(fā)表于 2010-09-09 11:29 |只看該作者
這個問題我一直沒太明白,我一般都把信息存到一個tmp的文本里,變通,不用這個子shell.
貌似要用文件描述符吧。我不懂。

論壇徽章:
5
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亞洲杯之朝鮮
日期:2015-03-13 22:47:33IT運維版塊每日發(fā)帖之星
日期:2016-01-09 06:20:00IT運維版塊每周發(fā)帖之星
日期:2016-03-07 16:27:44
3 [報告]
發(fā)表于 2010-09-09 11:33 |只看該作者
回復 1# wqfhenanxc


    bash:
  腳本在一個shell(父shell)中運行,而管道中每個命令卻在子shell中運行。

論壇徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年紀念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役紀念章
日期:2022-04-24 14:33:24
4 [報告]
發(fā)表于 2010-09-09 11:47 |只看該作者
當我在命令行中輸入./test.sh時,當前shell創(chuàng)建子shell,子shell看見有管道,于是創(chuàng)建孫shell

論壇徽章:
0
5 [報告]
發(fā)表于 2010-09-09 11:49 |只看該作者
回復 1# wqfhenanxc


第一個里面的Lines在子shell中,因此沒有改變。ABS里面建議使用第二種方式。

論壇徽章:
0
6 [報告]
發(fā)表于 2010-09-09 11:54 |只看該作者
回復 4# Shell_HAT


    這個解釋很通俗易懂啊   父 - 子 - 孫

論壇徽章:
0
7 [報告]
發(fā)表于 2010-09-09 12:03 |只看該作者
首先要搞清楚,在linux底下命令是如何執(zhí)行的,然后搞清楚父進程和子進程的關(guān)系,這兩個搞明白了,這個就不是問題了

論壇徽章:
0
8 [報告]
發(fā)表于 2010-09-09 14:05 |只看該作者
回復 4# Shell_HAT

下面是我的理解,不知道對不對:
腳本 中的 內(nèi)建命令都是直接在子shell中執(zhí)行的,
而腳本中的非內(nèi)建命令是由子shell fork出一個孫shell來執(zhí)行的,
但是對于管道,不管是不是內(nèi)建命令,都是在孫shell中執(zhí)行的,

while read line
do
((Lines++))
done < $0
這一段是內(nèi)建命令,是在子shell中執(zhí)行的,故其改變了子shell中Lines變量的值。

cat $0 | while read line
do
((Lines++))
done
這一段是在孫shell中執(zhí)行的,并不能改變子shell中Lines變量的值。

論壇徽章:
16
IT運維版塊每日發(fā)帖之星
日期:2015-08-24 06:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-10-14 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-10-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-11-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT運維版塊每日發(fā)帖之星
日期:2016-04-15 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-21 06:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2016-08-16 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運維版塊每日發(fā)帖之星
日期:2015-08-14 06:20:00
9 [報告]
發(fā)表于 2010-09-09 15:24 |只看該作者
回復 8# wqfhenanxc


    呵呵,這個解釋應(yīng)該很靠譜,MARK

論壇徽章:
0
10 [報告]
發(fā)表于 2018-01-31 19:28 |只看該作者
本帖最后由 maxh666_cn 于 2018-01-31 19:36 編輯

今天在linux下遇到這個奇怪的問題,百思不得其解,后來發(fā)現(xiàn)是while循環(huán)的問題,網(wǎng)上一搜果然如此,但是在IBM的Aix和HPUX下都沒有這個問題,這里記錄一下,供參考。可能是各廠商的內(nèi)部實現(xiàn)機制不同導致的。
# uname
AIX
# oslevel -s
5300-12-02-1036
# cat z.sh
Lines=0
cat $0 | while read line
do
  ((Lines=Lines+1))
done
echo "Number of lines read is: $Lines"
exit 0

#
#
# ./z.sh
Number of lines read is: 8
#
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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