Chinaunix

标题: 能否控制向脚本自动输一个回车 ? [打印本页]

作者: _will_    时间: 2006-03-29 12:43
标题: 能否控制向脚本自动输一个回车 ?
向Shell高手请教

假设我有一个脚本A.sh,里面内容为
read ans
echo 1
read ans
echo 2


我现在要打一个命令它调用A.sh,并且往里面输入一个回车,让A.sh能显示 '1' 后停在那里等我手动输入第二个回车。

我有试过echo '' |./A.sh,但它会一下子往A.sh送两个回车,并退出了,无法只送一个回车,不知道哪位有办法解决。

谢谢!
作者: yangprc    时间: 2006-03-29 14:15
试一试
echo -e "\r"
输入一个回车
作者: yjh777    时间: 2006-03-29 14:24
你这样的话, read 读的总是管道的内容.

你指定让第二个 read 从标准输出读就好了:
read -u 1 varname

___________________________________________________________________________
或者第一个read操作完成后,关闭管道.但是我不知道怎么关闭? 大家一起想想.

[ 本帖最后由 yjh777 于 2006-3-29 14:41 编辑 ]
作者: _will_    时间: 2006-03-29 15:17
谢谢楼上两位
echo -e "\r" | ./A.sh好象还是不行,好象的确是不能用管道,但我这个A.sh只是一个例子,实际的那个脚本里的代码是不能改的,所以也不能用 read -u 1 varname,难道真没有别的的方法了?
作者: r2007    时间: 2006-03-29 15:22
试试这个
  1. (echo;read;echo)|./A.sh
复制代码

作者: yjh777    时间: 2006-03-29 15:29
原帖由 _will_ 于 2006-3-29 15:17 发表
谢谢楼上两位
echo -e "\r" | ./A.sh好象还是不行,好象的确是不能用管道,但我这个A.sh只是一个例子,实际的那个脚本里的代码是不能改的,所以也不能用 read -u 1 varname,难道真没有别的的方法了?


不能改脚本的话,
那你就研究一下expect吧,听说她是专门解决交互式程序非交互化的。
研究出来,别忘了给大家分享一下。


  1. #! /usr/bin/expect -f
  2. # Change a login shell
  3. set passwd "123456"
  4. spawn ssh root@10.4.1.142
  5. expect "*password:*"
  6. send "$passwd\n"
  7. #expect eof
  8. interact
复制代码

作者: _will_    时间: 2006-03-29 15:43
原帖由 r2007 于 2006-3-29 15:22 发表
试试这个
  1. (echo;read;echo)|./A.sh
复制代码


试了一下,还真行,但不明白为什么,另外我试了一下(echo;read)|./A.sh也行,能否请斑竹解释一下原理啊!
作者: _will_    时间: 2006-03-29 15:46
原帖由 yjh777 于 2006-3-29 15:29 发表


不能改脚本的话,
那你就研究一下expect吧,听说她是专门解决交互式程序非交互化的。
研究出来,别忘了给大家分享一下。

[code]
#! /usr/bin/expect -f
# Change a login shell
set passwd "123 ...


expect不太懂,不过知道它这方面很强,有空一定研究分享一下
作者: r2007    时间: 2006-03-29 15:52
了解一下管道和重定向就会明白了。
去掉一个echo也得到同样的结果,是因为脚本A中第二个read命令在等待输入时,由于管道前端的subshell已经结束造成管道破裂,致使read ans返回空值,而脚本并没有加以判断,所以执行结果相同。
作者: yjh777    时间: 2006-03-29 16:05
我也试了一下:
# (echo iii;read;echo jjj) | sh kkk.sh
iii
asdfsadfsdfsadf
jjj
#

但是这样脚本里read读的值就不是,我们在终端里输入的值,而是()里echo的值.


难道是传说中的多线程交互?

[ 本帖最后由 yjh777 于 2006-3-29 16:09 编辑 ]
作者: _will_    时间: 2006-03-29 16:05
原帖由 r2007 于 2006-3-29 15:52 发表
了解一下管道和重定向就会明白了。
去掉一个echo也得到同样的结果,是因为脚本A中第二个read命令在等待输入时,由于管道前端的subshell已经结束造成管道破裂,致使read ans返回空值,而脚本并没有加以判断,所以 ...


谢谢,太高深了,致敬!
作者: yjh777    时间: 2006-04-01 19:30
原帖由 r2007 于 2006-3-29 15:52 发表
了解一下管道和重定向就会明白了。
去掉一个echo也得到同样的结果,是因为脚本A中第二个read命令在等待输入时,由于管道前端的subshell已经结束造成管道破裂,致使read ans返回空值,而脚本并没有加以判断,所以 ...


没听懂
为什么是 脚本A中第二个read命令在等待输入时 管道破裂???

前端的subshell的结束时机 与 脚本里的read命令之间有什么样的关系??
作者: yjh777    时间: 2006-04-03 08:36
___________________________
是我理解有误,所说的话删掉。

[ 本帖最后由 yjh777 于 2006-4-3 12:44 编辑 ]
作者: waker    时间: 2006-04-03 08:50
to yjh777
再仔细读r007的回贴,他已经解释的很清楚了
作者: yjh777    时间: 2006-04-03 09:13
原帖由 waker 于 2006-4-3 08:50 发表
to yjh777
再仔细读r007的回贴,他已经解释的很清楚了


你先写一个脚本试一下,那些值确实没有传给管道后的脚本。
作者: waker    时间: 2006-04-03 09:19
原帖由 yjh777 于 2006-4-3 09:13 发表


你先写一个脚本试一下,那些值确实没有传给管道后的脚本。


你在怀疑所有bash用户的智商么?


俺是不会去试1+1是不是=2的
作者: yjh777    时间: 2006-04-03 09:51
原帖由 waker 于 2006-4-3 09:19 发表


你在怀疑所有bash用户的智商么?


俺是不会去试1+1是不是=2的


对不起,是我表达有问题:
我是说的那些值是指,从屏幕上的标准输入读入的值。
可能是我错误理解了楼主的意图了。
郑重向所有bash用户道歉!
作者: waker    时间: 2006-04-03 10:06
如果你想让后面的 read ans读入输入的值,小改一下不就行了么?
(echo; read preans;echo $preans)|./A.sh
作者: yjh777    时间: 2006-04-03 10:35
原帖由 waker 于 2006-4-3 10:06 发表
如果你想让后面的 read ans读入输入的值,小改一下不就行了么?
(echo; read preans;echo $preans)|./A.sh

明白,谢谢waker!但总觉得这个方法不直接。其实读的还是subshell里echo的值。
是不是得想个法儿,让管道破裂后让它跟标准输入分离。。。
还是要向r2007道歉,前两天没有好好理解他的解释,还说他忽悠
作者: xchen301    时间: 2006-04-04 09:08
echo "^M"




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