You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何预选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:29:58