免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 19207 | 回复: 19
打印 上一主题 下一主题

能否控制向脚本自动输一个回车 ? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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送两个回车,并退出了,无法只送一个回车,不知道哪位有办法解决。

谢谢!

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-04-13 06:20:00
2 [报告]
发表于 2006-03-29 14:15 |只看该作者
试一试
echo -e "\r"
输入一个回车

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
3 [报告]
发表于 2006-03-29 14:24 |只看该作者
你这样的话, read 读的总是管道的内容.

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

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

[ 本帖最后由 yjh777 于 2006-3-29 14:41 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-03-29 15:17 |只看该作者
谢谢楼上两位
echo -e "\r" | ./A.sh好象还是不行,好象的确是不能用管道,但我这个A.sh只是一个例子,实际的那个脚本里的代码是不能改的,所以也不能用 read -u 1 varname,难道真没有别的的方法了?

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
5 [报告]
发表于 2006-03-29 15:22 |只看该作者
试试这个
  1. (echo;read;echo)|./A.sh
复制代码

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
6 [报告]
发表于 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
复制代码

论坛徽章:
0
7 [报告]
发表于 2006-03-29 15:43 |只看该作者
原帖由 r2007 于 2006-3-29 15:22 发表
试试这个
  1. (echo;read;echo)|./A.sh
复制代码


试了一下,还真行,但不明白为什么,另外我试了一下(echo;read)|./A.sh也行,能否请斑竹解释一下原理啊!

论坛徽章:
0
8 [报告]
发表于 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不太懂,不过知道它这方面很强,有空一定研究分享一下

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
9 [报告]
发表于 2006-03-29 15:52 |只看该作者
了解一下管道和重定向就会明白了。
去掉一个echo也得到同样的结果,是因为脚本A中第二个read命令在等待输入时,由于管道前端的subshell已经结束造成管道破裂,致使read ans返回空值,而脚本并没有加以判断,所以执行结果相同。

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
10 [报告]
发表于 2006-03-29 16:05 |只看该作者
我也试了一下:
# (echo iii;read;echo jjj) | sh kkk.sh
iii
asdfsadfsdfsadf
jjj
#

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


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

[ 本帖最后由 yjh777 于 2006-3-29 16:09 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP