箭头键通过标准输入(stdin)传输

3

我想通过标准输入stdin向bash发送箭头键:

cat | /bin/bash

然后我输入"echo hi" => "hi"出现在控制台上(当然不带引号) 接着我按了向上的箭头键 => 出现“^[[A命令未找到”的提示

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

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


你为什么想要向Bash发送箭头键?你试图解决什么问题? - Mark Byers
1
我想通过 Web 接口控制 Bash。因此,我必须能够向 Bash 发送这些键(例如,在 vi 中打开和编辑)。 - user219704
我知道那只是一个例子,但在vi中你不需要使用箭头键;这就是i、j、k和l的作用。 - Emerick Rogul
3个回答

5
你真正应该做的是创建一个伪终端设备(使用openpty()或类似函数),在该PTY上启动bash,并通过该PTY设备发送你的按键击。请参阅GNU C库手册中关于“Pseudo-Terminals”一节的内容。

是的,然后创建四个字符,包含箭头键的ASCII值,并使用以下代码将它们写入pty的主端: "write(MasterPTY_FD,CharContainingSomeArrowKey,sizeof(CharContainingSomeArrowKey))" 向上箭头键的十六进制代码为0x18。向下箭头键的十六进制代码为0x19。向左箭头键的十六进制代码为0x1B。向右箭头键的十六进制代码为0x1A。 - Klaus Fiedler

0

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


0
不要使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接