免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1712 | 回复: 6
打印 上一主题 下一主题

[文本处理] 关于使用linux管道时遇到的坑 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-05-26 14:47 |只看该作者 |倒序浏览
本帖最后由 夏织风 于 2017-05-26 18:06 编辑

今天遇到一个坑:
在脚本中调用server_function文件中的conf_del方法去删除配置文件
脚本代码(部分)如下:

#-------------------------------------------------
# Remove ALL GIS-Server
#-------------------------------------------------
[[ -e /tmp/gmond.log ]] && sudo -s /bin/bash -c "rm -rf /tmp/gmond.log" root
[[ -e /tmp/appserver.log ]] && rm -rf /tmp/appserver.log
[[ -e /tmp/sdeserver_master.log ]] && rm -rf /tmp/sdeserver_master.log
[[ -e /tmp/sdeserver_slave.log ]] && rm -rf /tmp/sdeserver_slave.log
conf_check CResult CPath $Service_Username
[[ $CResult -eq 1 ]] && conf_del $CPath
rm -rf $TOPDIR

然后在删除脚本所在的目录
其中,server_function文件中的conf_del方法:

function conf_del {
cnt_EV=`grep "export EVSERVER_RUNTIME" $1 | wc -l`
cnt_QT=`grep "export QT_PLUGIN_PATH" $1 | wc -l`
cnt_Flum=`grep "export FLUME_HOME" $1 | wc -l`
[[ $cnt_EV -eq 1 ]] && sed -i "/export EVSERVER_RUNTIME/d" $1
[[ $cnt_QT -eq 1 ]] && sed -i "/export QT_PLUGIN_PATH/d" $1
[[ $cnt_Flum -eq 1 ]] && sed -i "/export FLUME_HOME/d" $1
}

说白了就是删除.bashrc文件中的一些信息
因为我今天是测试别的功能,所以.bashrc文件中的相应的删除信息没有

所以,在执行到:

[[ $cnt_EV -eq 1 ]] && sed -i "/export EVSERVER_RUNTIME/d" $1
[[ $cnt_QT -eq 1 ]] && sed -i "/export QT_PLUGIN_PATH/d" $1
[[ $cnt_Flum -eq 1 ]] && sed -i "/export FLUME_HOME/d" $1

这个地方的时候杯具了!
脚本只返回:

[[ 0 -eq 1 ]]
[[ 0 -eq 1 ]]
[[ 0 -eq 1 ]]

然后不再执行删除脚本所在目录的操作

经过检查测试后发现,应该是Linux管道的问题
由于[[ 0 -eq 1 ]]失败导致无法退出conf_del方法

解决方法是:在conf_del方法里面追加一句

function conf_del {
cnt_EV=`grep "export EVSERVER_RUNTIME" $1 | wc -l`
cnt_QT=`grep "export QT_PLUGIN_PATH" $1 | wc -l`
cnt_Flum=`grep "export FLUME_HOME" $1 | wc -l`
[[ $cnt_EV -eq 1 ]] && sed -i "/export EVSERVER_RUNTIME/d" $1
[[ $cnt_QT -eq 1 ]] && sed -i "/export QT_PLUGIN_PATH/d" $1
[[ $cnt_Flum -eq 1 ]] && sed -i "/export FLUME_HOME/d" $1
echo "all informations have been deleted!"
}

之后,主脚本中的删除目录步骤就可以往下继续执行了。

PS:至于为什么会出现这个原因,我不是很清楚,希望知道的大咖们能和我交流一下!万分感谢!

论坛徽章:
8
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015小元宵徽章
日期:2015-03-06 15:58:18每日论坛发贴之星
日期:2015-06-08 22:20:00每日论坛发贴之星
日期:2015-06-08 22:20:00操作系统版块每日发帖之星
日期:2015-06-14 22:20:00数据库技术版块每日发帖之星
日期:2015-11-09 06:20:00数据库技术版块每日发帖之星
日期:2016-02-22 06:20:0015-16赛季CBA联赛之上海
日期:2017-01-01 23:58:53
2 [报告]
发表于 2017-05-26 16:37 |只看该作者
CPath 有没有斜杠?

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-12-17 06:20:00
3 [报告]
发表于 2017-05-26 16:46 |只看该作者
你应该详细跟踪一下 conf_del 的执行细节,你加了一句 echo, conf_del 函数永远返回真值,(除非echo执行失败,),函数最好结合return 定义返回值,同时区分函数的返回值和输出值。

论坛徽章:
0
4 [报告]
发表于 2017-05-26 17:11 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
5 [报告]
发表于 2017-05-26 18:04 |只看该作者
回复 4# 本友会机友会摄友会

不好意思,是我打错了,我的脚本中是没有问题的,你可以试试。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
6 [报告]
发表于 2017-05-26 18:05 |只看该作者
回复 2# zl624867243

CPath是我返回的一个路径变量,没有问题。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
7 [报告]
发表于 2017-05-26 18:10 |只看该作者
回复 3# vagrant_1220

在conf_del中添加echo就没有问题了,我的解决方法就是这么做的。
我确实跟踪了conf_del方法,如果将[[ $cnt_EV -eq 1 ]]、[[ $cnt_QT -eq 1 ]]、[[ $cnt_Flum -eq 1 ]]去掉,主脚本中是可以正常往下执行的,所以我觉得可能是因为返回的[[ 0 -eq 1 ]]造成了[[ $cnt_EV -eq 1 ]] && sed -i "/export EVSERVER_RUNTIME/d" $1等相关方法无法继续执行,所以无法退出conf_del方法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP