Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash vsql错误处理(无此类文件或目录)_Bash_Shell_Vertica_Vsql - Fatal编程技术网

Bash vsql错误处理(无此类文件或目录)

Bash vsql错误处理(无此类文件或目录),bash,shell,vertica,vsql,Bash,Shell,Vertica,Vsql,我正在使用shell脚本将查询结果上载到数据库。在脚本中,首先将查询结果保存到csv文件中,然后将该文件上载到另一个数据库中。在每一步之后,我都会向用户发送一封通知电子邮件。我面临的问题是,我无法进行正确的错误处理。例如,我使用如下命令生成csv文件: /apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -o "/data/test.csv" -c "select count(*), month f

我正在使用shell脚本将查询结果上载到数据库。在脚本中,首先将查询结果保存到csv文件中,然后将该文件上载到另一个数据库中。在每一步之后,我都会向用户发送一封通知电子邮件。我面临的问题是,我无法进行正确的错误处理。例如,我使用如下命令生成csv文件:

/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -o "/data/test.csv" -c "select count(*), month from table1 group by month" 
如果目录“data”不存在,Unix中的退出状态仍然返回0(即使发生错误,操作仍成功),因为查询结果显示在屏幕上。我如何处理这种错误?我应该在脚本中使用什么样的IF语句来捕获它


非常感谢

使用
mkdir-p/data
在查询之前确保目录存在。

这是一个棘手的问题

Vertica
vsql
有一个变量,
ON\u ERROR\u STOP
,如果设置该变量,将停止脚本并返回3的错误代码

\set ON_ERROR_STOP on
也就是说,使用-o选项似乎不会触发这种行为,因为错误不在SQL端

我的建议是作弊,重定向输出,而不是要求Vertica这样做:

/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv
请注意-F和-A选项以创建类似csv的输出。您可能希望-q(quiet)也只有查询输出,没有消息

然后,如果目标文件不存在,则您确实具有bash非空退出状态:

[me@server ~]$/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv
-bash: /data/test.csv: No such file or directory
[me@server ~]$ echo $?
1
从那时起,检查返回代码就足够容易了,可以捕获bash和Vertica

# your vsql command....
STATUS=$?
if [[ $STATUS -gt 0 ]]
then
    echo oops
    exit
fi

如果您有很多这样的问题,您甚至可能会创建一个函数,将查询和输出文件作为参数。

我有类似的问题,并找到了一种简单的方法来解决它。我注意到,当查询失败时,结果csv文件大小实际上变为0。您可以检查csv文件大小是否为0

vsql -c "your queries command" -o "/location/of/results" if [[ -s "/location/of/results" ]]; then some_other_command fi vsql-c“您的查询命令”-o“/location/of/results” 如果[[-s”/location/of/results“];然后 其他命令 fi
此外,如果您收到此错误:
error 5286:Unsupported设置选项ON\u error\u STOP


您可以使用
vsql
选项:
vsql-v ON\u ERROR\u STOP=ON

是的,但我的问题更多的是关于如何正确处理错误以及vsql是否将任何消息传递到Unix。可能还有其他一些错误,我想知道如何管理它们。您可以根据
vsql
的输出来管理这些错误。使用
output=$(您的命令)
捕获
vhost
的输出。然后,$output将成为查询结果。它如何帮助错误处理?这对您有用吗?我已经设置了此选项,但它仍然无法捕获错误