【问题标题】:arrow key via stdin通过标准输入的箭头键
【发布时间】:2009-11-26 21:53:12
【问题描述】:

我正在尝试通过标准输入向 bash 发送箭头键:

猫 | /bin/bash

然后我输入“echo hi”=>“hi”出现在控制台上(当然没有引号) 然后我按向上箭头键 => ^[[出现找不到命令

是否可以通过标准输入向程序发送箭头键?

我问的原因是:我想从另一个程序控制 bash。我想向 bash 发送箭头键

【问题讨论】:

  • 为什么要向 bash 发送箭头键?你想解决什么问题?
  • 我想通过 Web 界面控制 bash。因此我必须能够将这些键发送到 bash(例如在 vi 中打开和编辑)。
  • 我知道这只是一个例子,但你不需要在 vi 中使用箭头键;这就是 i、j、k 和 l 的用途。

标签: bash stdin tty pty


【解决方案1】:

您真正应该做的是创建一个伪 tty 设备(使用 openpty() 或类似设备),在该 PTY 上启动 bash,然后通过该 PTY 设备发送您的击键。请参阅 GNU C 库手册中的 the section on “Pseudo-Terminals”。

【讨论】:

  • 是的,然后制作四个包含箭头键的 ASCII 值的字符,并将它们写入 pty 的主端,使用“write(MasterPTY_FD, CharContainingSomeArrowKey, sizeof(CharContainingSomeArrowKey)”十六进制代码分配给向上箭头的字符是 0x18。向下是:0x19。左边是:0x1B。右边是:0x1A
【解决方案2】:

尝试使用 -i 开关启动 bash。

【讨论】:

    【解决方案3】:

    不要使用cat。使用 Bash 内置的 read 命令和 -e 选项来启用 readline 支持。

    # version 1
    while IFS="" read -r -e -d $'\n' line; do printf '%s\n' "$line"; done | /bin/bash
    
    # version 2
    #set -o pipefail
    # kill 0: kill process group
    (
    while IFS="" read -r -e -d $'\n' line; do 
       #trap 'trap - EXIT HUP INT QUIT PIPE TERM ERR; kill $PPID' EXIT HUP INT QUIT PIPE TERM ERR 
       trap 'trap - EXIT HUP INT QUIT PIPE TERM ERR; kill 0' EXIT HUP INT QUIT PIPE TERM ERR 
       printf '%s\n' "$line" >> ~/.bash_history
       history -n
       printf '%s\n' "$line" 
    done 
    ) | (trap 'trap - EXIT HUP INT QUIT PIPE TERM ERR; kill 0' EXIT HUP INT QUIT PIPE TERM ERR; /bin/bash)
    #) | (trap 'trap - EXIT HUP INT QUIT PIPE TERM ERR; kill $PPID' EXIT HUP INT QUIT PIPE TERM ERR; /bin/bash)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      相关资源
      最近更新 更多