【发布时间】:2020-11-28 19:20:16
【问题描述】:
#!/bin/bash
tty=$(readlink /proc/$$/fd/2)
echo "Paste Content below"
readarray -d '\n' lines < $tty
printf '%s\n' "${lines[@]}" > links.txt
所以我使用上面的脚本将文本块存储在变量 lines 中并将其写入文件 links.txt 。 问题是当 readarray 提示出现并粘贴我的文本时,我必须通过执行 ctrl + d 来停止读取过程,然后脚本继续进行并将存储的变量写入 links.txt
理想情况下,我希望某个特定关键字充当我粘贴的端点,一旦检测到该特定单词,阅读提示就会自动结束
例如,在我粘贴了我的内容之后。如果我在新行上输入stopread,它应该停止读取过程并继续执行脚本
(我刚刚以stopread这个词为例)
示例 - 在 readarray 提示符下,如果我粘贴
1
2
3
stopread
它应该将 1 ..3 存储在变量 lines 中并在脚本中继续进行,而无需执行 ctrl + d 来停止关闭读取提示
【问题讨论】:
-
readarray之后是否还有其他从标准输入读取的命令(例如提示用户输入)? -
那么这里就有问题了。您不能可靠地丢弃
stopread之后的行,存储单行输出 的命令将读取紧随stopread之后的行。试试readarray lines < <(sed '/stopread/q' /dev/tty),看看它是如何失败的。 -
@oguzismail 是的,下面还有一个读取命令(不是 readarray),它存储单行输出,所以只需按 Enter 就可以完成读取工作。我也在编写 readarray 和 read到 tty ,你可能还记得,我没有在这里添加它,因为它不是主要关注点,所以我保持代码尽可能简单
-
你需要一个循环,而不是
readarray/mapfile。 -
而且文件描述符 2 是标准的错误。 0 是 input 和你应该阅读的内容。