重定向 stderr 中的特定错误

重定向 stderr 中的特定错误

所以我想用一个if语句来运行一个脚本来导入一些函数。

$ cat functions.sh
#!/bin/bash

sampleFunction(){
    if [[ ! "${fakeVariable}" == '2' ]]
    then
        read -n1 -r -p "Error! Press any key to continue ..."
    fi
}
sampleFunction
echo "Well, hi!"

当我跑步时:

if ! 2>/dev/null . "${HOME}"'/functions.sh'
then
    echo "${HOME}"'/functions.sh could not be spawned. Terminating ...'
fi

控制台不输出Error! Press any key to continue ...,而是坐在那里,等待我按键。一旦我这样做了,我就会看到Well, hi打印出来的内容。

如果functions.sh缺少$HOME,那么它将打印:

/Users/leetbacoon/functions.sh could not be spawned. Terminating ...

正如它应该。

如果我取出2>/dev/null并且functions.sh存在的话,我会Error! Press any key to continue ...按应有的方式打印出来,并Well, hi!在按下按键后进行跟踪。

如果我拿出来2>/dev/null如果functions.sh丢失的,我得到:

-bash: /Users/leetbacoon/functions.sh: No such file or directory
/Users/leetbacoon/functions.sh could not be spawned. Terminating ...

基本上,我想要的是这样的:

$ ### functions.sh exists
$ if ! 2>/dev/null . "${HOME}"'/functions.sh' ; then echo "${HOME}"'/functions.sh could not be spawned. Terminating ...' ; fi
Error! Press any key to continue ...
Well, hi!
$ ###
$ ### functions.sh doesn't exist
$ if ! 2>/dev/null . "${HOME}"'/functions.sh' ; then echo "${HOME}"'/functions.sh could not be spawned. Terminating ...' ; fi
/Users/leetbacoon/functions.sh could not be spawned. Terminating ...

操作系统是 macOS High Sierra 10.13.6,bash 版本是 3.2.57(1)-release

答案1

提示和任何诊断消息始终在标准错误流上生成。这是为了不干扰普通输出的可能重定向。$PS1顺便说一句,对于 shell 的主提示符 ( ) 来说也是如此。

这意味着read -p输出的提示是写入标准错误流,并且由于您将该流重定向到/dev/null,因此您将永远不会看到提示消息。

我建议/Users/leetbacoon/functions.sh在尝试获取它之前测试是否存在:

if [ -f "$HOME/functions.sh" ]; then
    . "$HOME/functions.sh"
else
    printf '%s is missing...\n' "$HOME/functions.sh" >&2
done

~/.bash_profile这模仿了有时调用的方式~/.bashrc,并且避免了“没有这样的文件或目录”错误。

另请注意,您生成的错误消息具有误导性。获取文件不会“生成”任何东西,甚至不会生成子 shell。

答案2

read命令用于stderr打印提示。要么你必须

  1. 2> /dev/null调用脚本时避免使用
  2. 添加2>&1到命令末尾read以使其使用 stdout 来打印提示:
        read -n1 -r -p "Error! Press any key to continue ..." 2>&1

相关内容