在bash-here文档中模拟输入键

在bash-here文档中模拟输入键,bash,enter,heredoc,Bash,Enter,Heredoc,有没有一种方法可以模拟bash脚本中的ENTER键,通过here文档(EOF)将值输入到代码中。在bash中很容易实现,请参见 伪代码: #!/bin/bash code_executable << EOF value1 value2 EOF 若用户在输入314后并没有按键盘上的ENTER键,那个么可执行文件将挂起/停止并等待 编辑:请参见stdin缓冲中的异常,这些异常会阻止EOF将参数传递给可执行文件,如下面的@other guy答案所示 Enter通常由换行符表示

有没有一种方法可以模拟bash脚本中的ENTER键,通过here文档(EOF)将值输入到代码中。在bash中很容易实现,请参见

伪代码:

 #!/bin/bash
 code_executable << EOF
 value1
 value2 
 EOF
若用户在输入314后并没有按键盘上的ENTER键,那个么可执行文件将挂起/停止并等待


编辑:请参见stdin缓冲中的异常,这些异常会阻止EOF将参数传递给可执行文件,如下面的@other guy答案所示

Enter通常由换行符表示,而不是回车符。程序经常被回车符弄糊涂,所以终端会自动将它们转换为换行符

您可以在十六进制转储中看到这一点:

holen@vidarh2 11:14 ~ $ hexdump -C
(press enter several times, end with ctrl+d)
00000000  0a 0a 0a 0a                                       |....|
           ^----------- line feeds
如果查看脚本,您会发现它已经在value2和尾随空格后添加了一个:

$ cat yourscript 
#!/bin/bash
hexdump -C << EOF
value1
value2 
EOF

$ ./yourscript 
00000000  76 61 6c 75 65 31 0a 76  61 6c 75 65 32 20 0a     |value1.value2 .|
                                        line feed ----^
$cat脚本
#!/bin/bash
hextump-C
*有关实际问题的有用背景信息和提示,请参阅。
*这个答案假设一个从stdin读取提示输入的行为良好的程序——事实证明,不使用这样的程序正是OP的问题:当通过stdin提供输入时,与通过交互式键入提供输入时,它们的程序的行为不同

让我们使用以下脚本模拟可执行文件:

#!/usr/bin/env bash

printf ">Do you want to continue? (y)es or (n)o: "
read -r -n 1  confirm  # NOTE: A *single* keypress terminates input here.
printf "\nUser: $confirm\n"

printf ">Enter number: "
read -r  number
printf "User: $number\n"
要通过stdin将问题中的示例输入提供给此脚本,请使用:


您是否只想在
value2
之后但在
EOF
之前有一个空行?@chepner:我不确定。我在
value2
和EOF之间添加了一个文本空行,但仍然没有解决,可执行文件无法获取
value2
。可能是可执行文件中存在错误?对于问题中所示的脚本,可执行文件应该看到一行
“value1\n”
,后面是一行
“value2\n”
,后面是文件结束条件。在
value2
EOF
之间添加一个空行应该会给可执行文件增加一行
“\n”
。当你自己运行可执行文件并通过键盘输入时会发生什么?@Keith Thompson:可执行文件中没有bug<代码>值1
是在不等待回车的情况下提取的,而
值2
不是。从终端运行时会发生这样的情况:请求
value1
,然后在“键入”后,后者立即按照指令输入
value2
,直到键入ENTER。可能是
code\u可检查的
FTP.EXE
还是类似的?从/dev/tty读取的程序不能以这种方式重定向。@其他人:请看我上面的评论。谢谢你的解释。然而,这并不意味着一个解决方案。是的,这并不意味着你暗示的后续“为什么我的秘密程序不能解释正确添加的回车键?”@:我不理解你的评论。我通过终端模拟执行澄清了这个问题。@slkuser听起来仍然像是你程序中的一个bug。我添加了一个示例,其中三个程序在交互运行时工作相同,其中只有一个程序可以处理here文档。非交互式程序具有不同的缓冲和计时行为,而有缺陷的程序可能依赖这些行为。@其他人:非常感谢您提供的详细调试。所讨论的可执行文件使用了您指向的非标准函数,而不是自定义定义的函数来执行读取行。实际上,它的行为类似于非工作状态。@mklement0:非常感谢您的建议。我测试了你的解决方案,可惜没有用。我需要将几个参数传递给可执行文件,因此使用了
EOF
…但我愿意接受其他建议。@slkuser:我已经删除了here字符串替代项(
@mklement0:实际上使用
y314
而不是
314
并没有解决问题。之后(但之前)没有进一步的用户输入这个论点需要按Enter。此时唯一的合理解释是,C++程序不(一直)从STDIN读取,并且可能直接读取终端的提示输入(如已经建议的)。.在不知道您的程序真正的功能的情况下,我们无法帮助您。我的模拟您的程序的示例脚本在从stdin读取方面表现良好,并且,正如您所知,它工作正常。
$ ./ex1
Continue?
yes
Number?
123
You wrote: 123

$ ./ex1 << EOF
> yes
> 123
> EOF
Continue?
Number?
You wrote: 123
$ ./ex2
Continue?
yes
Number?
123
You wrote: 123

$ ./ex2 << EOF
yes
123
EOF

Continue?
Number?
You wrote: yes
$ ./ex3
Continue?
yes
Number?
123
You wrote: 123

$ ./ex3 << EOF
yes
123
EOF
Continue?
Number?
You wrote: 
#!/usr/bin/env bash

printf ">Do you want to continue? (y)es or (n)o: "
read -r -n 1  confirm  # NOTE: A *single* keypress terminates input here.
printf "\nUser: $confirm\n"

printf ">Enter number: "
read -r  number
printf "User: $number\n"
./code_executable <<EOF
y314
EOF
./code_executable <<EOF
y314
next input
...
EOF