我在做
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
打印为stderr
not stdout
。我最接近的是:
read -p " - This directory is not empty, purge? (Y/N): " choice 2> >(tee -a $mylogs)
echo $choice >> $mylogs
可以找到正在发生的事情的来源和解释这里。对于这个具体示例,第一行能够重定向stderr
到以在和 totee
中打印提示。$mylogs
stdout
然而,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