编辑

编辑

简单来说,我有一个用于read -e抓取用户输入的脚本,但由于环境原因,弹出大量“管道损坏”消息并污染了显示。我想隐藏 stderr,所以我尝试了这个:

main 2>/dev/null 

哪个作品,从本质上讲,我可以输入,而且管道损坏错误也消失了。但是,显然这种方法就是密码输入的工作方式,因为它会屏蔽我的输入。我看不到我正在输入的内容。

是否可以重定向流,以便我可以静音 stderr 而不静音输入?我猜read是使用 stderr 来传递提示,这可能会使这变得不可能,但问一问也无妨。

为了论证的目的,该脚本设计为在所述环境中运行,我不能简单地更改为不同的环境。


至于main,它是一个处理用户 I/O 并调用其他函数的函数。这是一个简化版本:

main(){
  while true; do
    get_input $(get_completions)
    [ $choice == "d" ] && fn_delete; continue
    [ $choice == "vwr" ] && fn_change_vwr_command; continue
    [ ... ]
  done
}

它本身运行良好。当我运行时main 2>/dev/null,错误消失并且我的输入被静音。


编辑

这个问题已经解决了。解决方法是使用 将 read 的 stderr 重定向到其 stdout 2>&1

瞧,这就是为什么我喜欢在处理用户输入时只创建一个“input-getter”函数。对我来说,实现上述补丁就像编辑一行代码一样简单get_input()

答案1

您可以将read重定向stderrstdout

read -p "Input: " x 2>&1

script.sh

#!/bin/bash
read -p "Input: " x 2>&1

截屏

相关内容