2017-07-03 403 views
0

我试图用一些很好的命令行脚本自动化我的工作。我有一个脚本(jenkins_cli.sh),其与詹金斯服务器进行通信,它看起来像这样:在GIT for Windows bash中使用'xargs'

cd $1 

if [ -z ${JENKINS_CREDENTIALS+x} -o -z ${JENKINS_SERVER+x} ] 
    then 
    JENKINS_SERVER=$(<jenkins_url.txt) 
    JENKINS_CREDENTIALS=$(<credentials.txt) 
fi 

java -jar jenkins-cli.jar -s $JENKINS_SERVER -auth $JENKINS_CREDENTIALS ${@:2} 

这工作得很好。

例如,如果我拨打./jenkins_cli.sh localhost/ list-jobs,我会得到当前在本地Jenkins服务器上运行的任务列表。但是,如果我尝试做一些更花哨(如:./jenkins_cli.sh localhost/ list-jobs | xargs -L1 ./jenkins-cli localhost/ delete-job我得到以下错误:'RROR: No such job 'test_job作业test_job存在作业'test_job存在请​​问这个角色'最终在我的命令。?

我猜这与我使用GIT for Windows附带的bash或它如何处理换行符或我如何处理脚本中的参数等事实有关。如果我执行./jenkins_cli.sh localhost/ list-jobs | xargs -L1 echo我得到预期的结果没有任何引号..我真的不知道如何进一步调试这个问题我有一个解决方案,我只是写作业列表到一个文件,然后读取每一行,并通过我吨至我的自定义脚本,但我真的想与xargs :)

+0

我忘了提:如果我使用'./jenkins_cli本地主机/删除在职test_job'它删除按预期 – tim

回答

2

我觉得现在的问题是,从你的jenkins命令的输出使用输出的DOS结束线条样式(\r\n)来实现它,但git shell命令期望经典的UNIX行结尾样式(\n)。

问题在于xargs将流浪的\r看作是行尾的特殊字符,并试图将其转义。但是,即使一切顺利,下一个命令的参数不会是test_job,而是test_job\r\r可能不可见)。

最简单的解决方案是使用dos2unix

java -jar jenkins-cli.jar -s $JENKINS_SERVER -auth $JENKINS_CREDENTIALS ${@:2} | dos2unix 
+0

非常感谢你的工作: ) – tim

+2

'\ r'不是完全不可见的:它会导致“光标”跳回到行首。这就是为什么你看到'RROR'而不是'ERROR':关闭'''前面​​是'\ r',所以它在行的开始处结束。 – Thomas

相关问题