当我想创建几个 shell 命令时,我的脚本管道返回第一个命令的答案而不执行管道。这是我的情况:我想在 HTML 页面上获取特定内容。所以我在页面上卷曲,然后是 grep,最后是 awk。
def checkState(hostUri, check) {
node('master') {
def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F \'"\' {\'print $2\'}'
println result
}
只有我的管道的控制台返回对应只执行curl命令而不执行grep和awk。
Running on Jenkins in /var/lib/jenkins/workspace/Clearcase@8
[Pipeline] {
[Pipeline] sh
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
...
</html>
[Pipeline] }
[Pipeline] // node
我尝试了不同的方法,例如使用脚本管道中不存在'''
的命令。new BuildProcess
在所示的 Jenkinsfile 中,变量赋值涉及一个 shell 步骤:
此时 Jenkins 将调用一个 shell,并将以下命令传递给它:
&&
运算符表示 AND 列表。在这种情况下,如果curl
命令成功,则grep
执行命令,如果成功,则执行awk
命令。这些命令的标准输入/输出/错误流没有相互连接。由于这里的目的是解析
curl
使用grep
andawk
语句的输出,因此应该使用管道而不是&&
运算符:考虑引用
hostUri
&check
变量,以防您最终在这些字段中使用特殊字符。最后一点:如果没有文件名参数或某种输入,命令
grep ${check}
&在技术上是不完整的。awk -F '"' {'print $2'}
如果您从 shell 终端按原样运行它们,它们只会卡住。但是,由于 Jenkins 以非交互方式运行构建过程,我假设他们的标准输入流是从/dev/null
. 在这种情况下,grep
命令将失败并显示非零错误代码。