如何将“read -p”的输出打印到标准输出和另一个文件

如何将“read -p”的输出打印到标准输出和另一个文件

我在做

echo -n "  - This directory is not empty, purge? (Y/N):   " | tee -a $mylogs
read choice
echo "$choice" | tee -a $mylogs

但我想尝试将其压缩为:

read -p "  - This directory is not empty, purge? (Y/N): " choice | tee -a $mylogs

这会打印到 stdout 但不会打印到$mylogs.此外, 中没有保存任何内容$choice。有没有解释为什么会这样?任何 1 或 2 行替代方案

  • 打印提示
  • 打印用户输入
  • 将输入保存在$choice

我只想记录脚本的这一部分并能够重用$choice

答案1

读了一点资料后,我发现由 @lesmana 提供,可能会有所帮助

运行你的脚本

script -q -a -f logfile -c 'sh ./yourscriptname'

为了向“用户”隐藏此日志记录,我只需将这一行脚本作为目标脚本的包装器,然后从包装器中调用目标脚本。

答案2

编辑:我意识到,如果没有任何内容通过管道传输到它,tee可以从原始内容中读取内容stdin,所以我想我应该添加另一个解决方案,以防它对以后偶然发现这个问题的人有所帮助。

感谢 @steeldriver 指出read -p打印为stderrnot stdout。我最接近的是:

read -p "  - This directory is not empty, purge? (Y/N): " choice 2> >(tee -a $mylogs)
echo $choice >> $mylogs

可以找到正在发生的事情的来源和解释这里。对于这个具体示例,第一行能够重定向stderr到以在和 totee中打印提示。$mylogsstdout

然而,read似乎正在做一些事情来使其无法拦截用户输入并将其发送到$mylogs而不仅仅是$choice.

另一种解决方案更简单、更短,但用户友好性和可读性较差(除非很多人知道这read不是唯一一个如此简单地读取输入的命令):

echo -n "  - This directory is not empty, purge? (Y/N): " | tee -a $mylogs
choice=$(tee -a $mylogs)

因此,第二行tee提供了一种将用户输入提供给两个都 $mylogs $choice,与 不同read,但显然没有迅速的选项 (-p)。所以还是2行。

另外,您必须按Enter+Ctrl才能D提交。这可能对我的 Y/N 情况不利,但对于多行答案可能很好,因为您可以在按+停止Enter之前按多次。CtrlD

相关内容