我想运行此命令source .env
(获取.env文件),如果.env
文件在采购时出现了一些错误。我想在错误输出之前显示一条消息“嘿,你的.env中有错误”,否则如果没有错误,我不想显示任何内容。
以下是需要编辑的代码示例:
#!/bin/zsh
env_auto_sourcing() {
if [[ -f .env ]]; then
OUTPUT="$(source .env &> /dev/null)"
echo "${OUTPUT}"
if [ -n "$OUTPUT" ]; then
echo "Hey you got errors in your .env"
echo "$OUTPUT"
fi
}
答案 0 :(得分:2)
您可以使用bash -n
(zsh
也有-n
选项)在获取脚本之前对其进行语法检查:
env_auto_sourcing() {
if [[ -f .env ]]; then
if errs=$(bash -n .env 2>&1);
then source .env;
else
printf '%s\n' "Hey you got errors" "$errs";
fi
fi
}
将语法检查错误存储在文件中比您在代码中使用的子shell方法更清晰。
bash -n
有一些陷阱,如下所示:
答案 1 :(得分:1)
为什么不直接使用命令 source
中的退出代码?
您不必为此使用 bash -n
,因为 ...
假设您的 .env 文件包含这 2 行无效的行:
dsadsd
sdss
如果您使用上面的示例运行当前接受的代码:
if errs=$(bash -n .env 2>&1);
上述情况将无法阻止文件的采购。
因此,您可以使用 source
命令返回码来处理所有这些:
#!/bin/bash
# This doesn't actually source it. It just test if source is working
errs=$(source ".env" 2>&1 >/dev/null)
# get the return code
retval=$?
#echo "${retval}"
if [ ${retval} = 0 ]; then
# Do another check for any syntax error
if [ -n "${errs}" ]; then
echo "The source file returns 0 but you got syntax errors: "
echo "Error details:"
printf "%s\n" "${errs}"
exit 1
else
# Success here. we know that this command works without error so we source it
echo "The source file returns 0 and no syntax errors: "
source ".env"
fi
else
echo "The source command returns an error code ${retval}: "
echo "Error details:"
printf "%s\n" "${errs}"
exit 1
fi
这种方法最好的一点是,它还会检查 bash
语法和 source
语法:
现在您可以在您的 env 文件中测试这些数据:
-
~
@
~<
>