如何在expect(1)中控制子进程回显并获取终端回显状态?
在expect(1)中设置与获取子进程终端回显状态的正确方法
设置子进程回显状态
- 不要在
spawn前直接执行stty -echo,这个操作只会修改当前expect进程的终端属性,不会传递给后续启动的子进程。 - 正确的做法是使用expect的
stty_init配置:
这个配置会在set stty_init "-echo" # 禁用回显;若要启用则改为"echo" spawn your_command_herespawn初始化子进程终端时生效,直接修改子进程的终端回显属性。
获取子进程回显状态
expect没有内置的终端属性查询命令,可通过以下两种方式实现:
在子进程中执行stty命令并解析输出
可以直接让子进程执行stty -a,捕获输出后提取回显状态:spawn sh -c "$main_command; stty -a" expect -re {echo\s*(on|off)} set echo_state $expect_out(1,string)若要避免影响主命令执行,也可以在
spawn后单独发送stty -a命令:spawn $main_command send "stty -a\r" expect -re {echo\s*(on|off)} set echo_state $expect_out(1,string) puts "子进程终端回显状态:$echo_state"获取子进程真实终端路径后执行stty
你遇到的tty_spawn_id显示为exp5是expect内部的通道标识,并非真实终端设备路径。要获取子进程的终端路径,可让子进程执行tty命令:spawn $main_command send "tty\r" expect -re {/dev/tty\w+} set child_tty $expect_out(0,string) # 直接通过终端路径查询回显状态 set stty_output [exec stty -F $child_tty -a] regexp {echo\s*(on|off)} $stty_output -> echo_state puts "子进程终端回显状态:$echo_state"
内容的提问来源于stack exchange,提问作者pavel
相关产品推荐
相关产品推荐

