所以我想用一个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
打印提示。要么你必须
2> /dev/null
调用脚本时避免使用- 添加
2>&1
到命令末尾read
以使其使用 stdout 来打印提示:
read -n1 -r -p "Error! Press any key to continue ..." 2>&1