SVN工作副本检测脚本异常求助:svn info与grep配合失效问题
解决svn info与grep配合失效的问题
首先得说清楚问题的根源:Subversion会把错误信息输出到标准错误流(stderr),而不是标准输出流(stdout)。我们平时用管道|的时候,默认只把前一个命令的stdout传给下一个命令,所以grep根本没拿到那些错误内容,自然没法匹配和高亮——哪怕你改匹配字符串,错误信息还是会直接打印到终端,因为它走的是另一个输出通道。
给你几个可行的解决办法:
1. 重定向stderr到stdout
把svn的错误输出强制转到stdout,这样grep就能处理了,命令如下:
svn info 2>&1 | grep E155007
这里的2>&1是shell重定向语法:2代表stderr的文件描述符,1代表stdout,这条指令就是把stderr的内容合并到stdout里,让grep能捕获到错误信息。
2. 用退出码判断(更适合脚本场景)
写脚本的话,其实不用抓错误字符串,直接检查svn命令的退出码更可靠:
- 如果是SVN工作副本,
svn info或svn status会返回退出码0 - 如果不是,会返回非0的退出码
比如可以这么写:
# 用svn status检查,同时把所有输出丢弃(避免干扰) if svn status --show-updates > /dev/null 2>&1; then echo "当前目录是SVN工作副本" else echo "当前目录不是SVN工作副本" fi
这个方法比检测.svn文件夹更靠谱——万一.svn目录存在但工作副本已经损坏,检测文件夹的方法会误判,而svn命令能准确识别这种情况。
3. 额外说明:为什么改匹配项还是有输出
之前你把匹配项改成A155007时,错误信息依然显示,是因为这些错误内容直接从stderr输出到了终端,根本没经过grep处理。grep只处理stdout的内容,所以不管你怎么改匹配规则,stderr的内容都会直接打印出来。
内容的提问来源于stack exchange,提问作者rcrdsft
相关产品推荐
相关产品推荐

