在bash here-document中模拟ENTER键

时间:2016-08-02 18:03:54

标签: bash enter heredoc

有没有办法在bash脚本中模拟ENTER键,通过here-document(EOF)将值插入代码。很容易在bash中看到question 6264596

伪代码:

 #!/bin/bash
 code_executable << EOF
 value1
 value2 
 EOF

value2之后需要回车,即从shell执行时输入。

谢谢你们。

模拟在终端上运行的可执行文件:

  $./code_executable
  >Do you want to continue? yes or no
  User: y
  >Enter number:
  User: 314 

如果用户在输入314后没有在键盘上按ENTER,则可执行文件挂起/暂停并等待。

编辑:查看stdin缓冲中的异常,阻止EOF将参数传递给可执行文件,如下面的@that其他人回答所示。

2 个答案:

答案 0 :(得分:2)

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 ----^

以下是此工作的一个示例:

$ ./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: 

他们分别阅读fscanf(stdin, ..)fdopen(0, "r"); fscanf(file, ...read(0, buffer, 1024)的行。只有第一个是正确的。

答案 1 :(得分:0)

*有关实际问题的有用背景信息和提示,请参阅that other guy's helpful answer *这个答案假定一个行为良好的程序从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"

使用here-document

通过stdin将问题中的示例输入提供给此脚本
./code_executable <<EOF
y314
EOF

请注意y314之间缺少换行符,以说明第一个提示需要输入ENTER键提交输入 - 只有一个字符。

使用here-document,整体输入总是以换行符(\n结尾,就像按下了Enter键一样(如说明所述)在that other guy's helpful answer)中,因此将输入提交给第二个提示。

可以在结束EOF分隔符之前添加其他提示输入,每个附加输入都要求Enter在其自己的行上提交。

./code_executable <<EOF
y314
next input
...
EOF