Chinaunix

标题: 请教read问题 [打印本页]

作者: whtlly    时间: 2005-04-01 18:39
标题: 请教read问题
请问read命令可以通过管道读变量吗?比如

echo 'a b c d'|read -a dd


echo 'asdf'|read ddd

我试了,不成
难道非得把输出定向到一个文件中,然后raad从文件中读变量吗?
下面的命令太罗嗦了
echo 'a b c d e f'>/tmp/dd;read -a dd</tmp/dd;rm -rf /tmp/dd
作者: 一梦如是    时间: 2005-04-01 18:46
标题: 请教read问题
当然可以,您试了,怎么不成,说清楚
作者: 寂寞烈火    时间: 2005-04-01 19:39
标题: 请教read问题
http://bbs.chinaunix.net/forum/viewtopic.php?t=237464
作者: aerofox    时间: 2005-04-01 21:23
标题: 请教read问题
原帖由 "whtlly" 发表:
请问read命令可以通过管道读变量吗?比如

echo 'a b c d'|read -a dd


echo 'asdf'|read ddd

我试了,不成
难道非得把输出定向到一个文件中,然后raad从文件中读变量吗?
下面的命令太罗嗦了
echo 'a..........

用管道read本身是成功的,但是读取的值保存在子进程的变量中,调用read的进程中无法获得这些值。
作者: whtlly    时间: 2005-04-02 21:36
标题: 请教read问题
[quote]原帖由 "一梦如是"]当然可以,您试了,怎么不成,说清楚[/quote 发表:

[root@localhost tmp]# echo 'a b c d e'|read -a aaa
[root@localhost tmp]# echo $aaa

[root@localhost tmp]# echo ${aaa[1]}

[root@localhost tmp]# echo ${aaa[0]}

[root@localhost tmp]# read -a bbb
a b c d e
[root@localhost tmp]# echo ${bbb[0]}
a
[root@localhost tmp]# echo ${bbb[1]}
b
[root@localhost tmp]# echo ${bbb[2]}
c
[root@localhost tmp]# echo $bbb
a
作者: whtlly    时间: 2005-04-02 21:37
标题: 请教read问题
[quote]原帖由 "寂寞烈火"]http://bbs.chinaunix.net/forum/viewtopic.php?t=237464[/quote 发表:

上面的帖子看过了
作者: li2002    时间: 2005-04-02 21:43
标题: 请教read问题
aerofox   不是解释过了,read的变量在其子进程中才能使用
作者: whtlly    时间: 2005-04-02 21:43
标题: 请教read问题
原帖由 "aerofox" 发表:

用管道read本身是成功的,但是读取的值保存在子进程的变量中,调用read的进程中无法获得这些值。


没明白您的意思,我是在命令行中执行
echo 'a b c'|read -a ddd
上面的命令并没有用()括起来,也没有放到脚本中,为什么无法获得这些值?
作者: li2002    时间: 2005-04-02 21:58
标题: 请教read问题
你用管道这样执行read,就会产生一个子进程的,所有你如果要用此变量就要在此子进程中用,如

  1. echo 'a b c'|(read -a ddd;echo ${ddd[0]},${ddd[1]},${ddd[2]})

  2. a,b,c

复制代码

作者: whtlly    时间: 2005-04-02 22:09
标题: 请教read问题
刚才做了个试验,终于明白了
  1. [root@localhost subsys]# (sleep 100;echo asd)|read ddd&
  2. [1] 1273
  3. [root@localhost subsys]# pstree -p
  4. init(1)-+-bdflush(11)
  5.         |-crond(569)
  6.         |-keventd(4)
  7.         |-khubd(88)
  8.         |-kjournald(24)
  9.         |-kjournald(177)
  10.         |-kjournald(178)
  11.         |-kjournald(191)
  12.         |-kjournald(195)
  13.         |-kjournald(196)
  14.         |-klogd(538)
  15.         |-kscand/DMA(8)
  16.         |-kscand/HighMem(10)
  17.         |-kscand/Normal(9)
  18.         |-ksoftirqd_CPU0(5)
  19.         |-ksoftirqd_CPU1(6)
  20.         |-kswapd(7)
  21.         |-kupdated(12)
  22.         |-mdrecoveryd(13)
  23.         |-mingetty(575)
  24.         |-mingetty(576)
  25.         |-mingetty(577)
  26.         |-mingetty(578)
  27.         |-mingetty(579)
  28.         |-mingetty(580)
  29.         |-scsi_eh_0(19)
  30.         |-scsi_eh_1(20)
  31.         |-sshd(559)---sshd(581)---bash(582)---su(611)---bash(612)-+-bash(1272)---sleep(1274)
  32.         |                                                         |-bash(1273)
  33.         |                                                         `-pstree(1276)
  34.         `-syslogd(534)
复制代码


开始以为read是内部命令,根本不涉及到child process,做过上面的试验才知道,管道右边的read,是在sub-shell中执行的。

读了 lightspeed   的Shell 经典问题之 [ I/O 重定向] [1]  
http://bbs.chinaunix.net/forum/viewtopic.php?t=446947&show_type=&postdays=0&postorder=asc&start=0

有个疑问,管道可以由子进程向父传递数据吗?


另外,sub-shell中的变量,父进程怎么才能使用?
作者: aerofox    时间: 2005-04-03 17:20
标题: 请教read问题
[quote]原帖由 "whtlly"]有个疑问,管道可以由子进程向父传递数据吗?[/quote 发表:

可以。整个管道的返回值(也就是最后一条命令的返回值)返回到父进程。管道的标准输出可以赋给父进程的变量,如:
lastfile=`ls | tail -1`
[quote]原帖由 "whtlly"]另外,sub-shell中的变量,父进程怎么才能使用?[/quote 发表:

用一般的办法,父进程无法修改子进程中的变量,子进程未结束前无法得到子进程的变量值(结束时可以用上面的方法得到)。如果想在子进程执行期间修改子进程的变量,或者得到子进程中变量的值,可以使用进程间通讯的方法。

欢迎指正错误。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2