如何预选Bash交互脚本选项2并保留输入交互性?
预选择Bash脚本选项并保留后续交互性
你的问题出在管道 echo "2" | sh /tmp/czr.sh 会将脚本的标准输入(stdin)完全替换为echo的输出,当脚本执行第二个read时,stdin已无内容,导致typed变量为空,grep -i ""会匹配所有行,最终输出整个日志。
以下是几种可行的解决方案:
方法1:借助/dev/tty保留终端输入
用cat拼接预输入内容与终端输入,让第一个read读取预输入的"2",第二个read从终端获取输入:
printf "2\n" | cat - /dev/tty | sh /tmp/czr.sh
cat -表示读取标准输入的内容(即printf "2\n"的输出)/dev/tty直接指向当前终端,确保后续输入能从终端读取
方法2:修改脚本支持命令行参数(推荐)
修改脚本使其支持通过命令行参数指定预选项,既保留原交互模式,又能直接指定选项启动,逻辑更清晰:
#!/bin/bash # Starting - sh /tmp/czr.sh # 优先使用命令行参数作为选择,无参数则进入交互选择 select=${1:-} if [ -z "$select" ]; then printf "1 - Option 1\n2 - Option 2\n"; read -r select fi if [ "$select" = "1" ]; then echo "Option 1 do nothing" elif [ "$select" = "2" ]; then echo -n "Type what to find: " read -r typed grep -i "$typed" --color /var/log/httpd/maps_error_log fi exit
使用方式:
- 保留原交互模式:
sh /tmp/czr.sh - 预选择选项2:
sh /tmp/czr.sh 2,执行后直接提示输入搜索内容
方法3:使用expect自动发送预选项
若不想修改脚本,可使用expect工具自动完成选项选择,之后交回终端交互:
#!/usr/bin/expect spawn sh /tmp/czr.sh expect "1 - Option 1\n2 - Option 2\n" send "2\r" interact
将上述内容保存为preselect.exp,赋予执行权限后运行:
chmod +x preselect.exp ./preselect.exp
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

