模拟bash-here文档中的ENTER键



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

伪代码:

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

value2后面需要一个回车,即从shell执行时的ENTER。

谢谢大家。

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

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

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

编辑:请参阅stdin缓冲区中的异常,这些异常阻止EOF将参数传递给可执行文件,如下面另一个人回答的@所示。

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

这里是另一种缓冲错误的第三个例子,其中程序以相同的交互方式工作,但似乎没有收到来自Here文档的输入:

$ ./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)的行。只有第一个是正确的。

*查看其他人的有用答案,了解有用的背景信息和实际问题的提示。
*这个答案假设一个行为良好的程序从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: $confirmn"
printf ">Enter number: "
read -r  number
printf "User: $numbern"

要通过stdin向该脚本提供问题中的示例输入,请使用以下文档:

./code_executable <<EOF
y314
EOF

请注意,y314之间没有换行符,这是因为第一个提示不需要按ENTER键来提交输入-只需要一个字符。

对于here文档,整个输入总是以换行符(n)结束的作用就像按下了Enter键(正如其他人的有用答案中所解释的那样),因此将输入提交给第二个提示。

额外的提示输入可以简单地添加在关闭EOF分隔符之前,每个额外的输入都需要Enter在自己的行上提交。

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

相关内容

  • 没有找到相关文章

最新更新