Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 为什么有些评论行被尊重,有些被忽略并给出错误_Bash_Shell_Jenkins_Jenkins Pipeline - Fatal编程技术网

Bash 为什么有些评论行被尊重,有些被忽略并给出错误

Bash 为什么有些评论行被尊重,有些被忽略并给出错误,bash,shell,jenkins,jenkins-pipeline,Bash,Shell,Jenkins,Jenkins Pipeline,詹金斯版本:2.164.3 我有我的Jenkins文件,在其中一个阶段,我调用了下面的代码,但它给了我一个错误。 我不明白为什么它会给我一个错误,在语法方面,它看起来还可以 Jenkins文件代码快照: 我收到的错误消息是: 10:38:38 -- Checking out dependent code: 10:38:38 10:38:38 -- Cloning Common Code. 10:38:38 10:38:38 Cloning into 'common_utilities'...

詹金斯版本:2.164.3

我有我的Jenkins文件,在其中一个阶段,我调用了下面的代码,但它给了我一个错误。 我不明白为什么它会给我一个错误,在语法方面,它看起来还可以

Jenkins文件代码快照:

我收到的错误消息是:

10:38:38 -- Checking out dependent code:
10:38:38 
10:38:38 -- Cloning Common Code.
10:38:38 
10:38:38 Cloning into 'common_utilities'...
10:38:39 
10:38:39 -- Cloning Exporter Tool
10:38:39 
10:38:39 Cloning into 'jira-exporter'...
10:38:39 /jenkins_workspaces/workspace/development/project/my_jenkins_job/251@tmp/durable-f88d4c2a/script.sh: line 21: --: command not found
问题:

shell脚本逻辑中的第一行comment-comment-1由Jenkinsfile执行,没有语法问题,我们可以看到以下echo和git命令的输出,我可以在我的工作区中看到,git存储库已成功克隆


开始第二条评论评论2。行之后,接下来的几行都在Shell逻辑中注释掉了,但是脚本在最后一行之前的某个地方注释掉了一行,而我正在打印当前目录:。。因为在到达最后一条回音线之前发生了错误,所以根本不会打印最后一条回音线。如果最后一条回显行之前的所有行都被注释了,那么为什么会出现错误。从文件中运行shell代码在计算机上运行良好。

我不确定确切的问题是什么,但请尝试使用更明确定义的命令(如printf)重写脚本


我不确定确切的问题是什么,但请尝试使用更多定义良好的命令(如printf)重写脚本


经过一番挖掘,我发现:

问题是\n以及如何在Groovy和Shell代码中处理它

在Jenkins文件Groovy代码中,当它读取上述代码时 帖子里的舞台,上面写着,哦,我得到了这个贝壳编写代码,我将在自己的Groovy世界中解析它,并创建一个动态临时shell脚本aka..@tmp/durable-f88d4c2a/script.sh

第一个Groovy出现是因为Jenkinsfile是用Groovy编写的,它打破了所有用sh“…”包装的语句将代码编码到新行中,然后Jenkins创建一个dynamic.shshell脚本来完成这项工作

如果使用\n的命令未被注释掉,则此操作有效,但如果使用\n的命令实际被注释掉,则此操作无效

为了调查这个问题,我在sh'…'中添加了以下行设置+x行后的部分

我在set+x行之后添加了cat-n$0,以打印整个shell dynamic temp.sh脚本,并查看Jenkinsfile Groovy logic是如何解析这个视觉上的sh'…'的在执行之前,将my Jenkins File-->中的代码转换为真正的Shell.sh脚本

我发现,它处理/破坏/解析了sh'…'部分例如,一条线,如:

echo-e\n-Cloning Exporter Tool \n在Jenkins创建的动态创建的.sh脚本中插入以下代码行:

echo-e在动态temprarory.sh脚本中的一行上 然后

-在另一行克隆导出器工具,然后

另一行

现在,上面的代码可以很好地工作,因为保留了双引号,并且实际上有一个有效的echo命令,它使用这个字符在控制台输出上打印

当线路是:

echo-e\n-将导出器工具\n克隆到以下代码中:

Groovy将其解析为动态temp.sh文件,如下所示:

echo-e在动态temprarory.sh脚本中的一行上 然后

-在另一行克隆导出器工具,然后

另一行

在这里,根据shell逻辑,它会像预期的那样呕吐,并且没有像echo这样的命令包装器,因为它被注释为-。。。工作。因此,我们没有找到命令

宙斯


结论:在sh'…'中必须小心使用\n在Jenkinsfile的第节中,对于注释或实际代码行,否则将看到命令NotFound错误。或者,最好通过一些版本控制工具GIT中提供的脚本调用上述代码行,而不是将所有这些代码行放入Jenkins文件本身。

因此,经过一些挖掘,我发现:

问题是\n以及如何在Groovy和Shell代码中处理它

在Jenkins文件Groovy代码中,当它读取上述代码时 帖子里的舞台,上面写着,哦,我得到了这个贝壳编写代码,我将在自己的Groovy世界中解析它,并创建一个动态临时shell脚本aka..@tmp/durable-f88d4c2a/script.sh

第一个Groovy出现是因为Jenkinsfile是用Groovy编写的,它打破了所有用sh“…”包装的语句将代码编码到新行中,然后Jenkins创建一个dynamic.shshell脚本来完成这项工作

如果使用\n的命令未被注释掉,则此操作有效,但如果使用\n的命令实际被注释掉,则此操作无效

为了调查这个问题,我在sh'…'中添加了以下行设置+x行后的部分

我在set+x行之后添加了cat-n$0,以打印整个shell dynamic temp.sh脚本,并查看Jenkinsfile Groovy logic是如何解析这个视觉上的sh'…'的在执行之前,将my Jenkins File-->中的代码转换为真正的Shell.sh脚本

我发现,它被处理/破坏/解析 嘘‘……’部分例如,一条线,如:

echo-e\n-Cloning Exporter Tool \n在Jenkins创建的动态创建的.sh脚本中插入以下代码行:

echo-e在动态temprarory.sh脚本中的一行上 然后

-在另一行克隆导出器工具,然后

另一行

现在,上面的代码可以很好地工作,因为保留了双引号,并且实际上有一个有效的echo命令,它使用这个字符在控制台输出上打印

当线路是:

echo-e\n-将导出器工具\n克隆到以下代码中:

Groovy将其解析为动态temp.sh文件,如下所示:

echo-e在动态temprarory.sh脚本中的一行上 然后

-在另一行克隆导出器工具,然后

另一行

在这里,根据shell逻辑,它会像预期的那样呕吐,并且没有像echo这样的命令包装器,因为它被注释为-。。。工作。因此,我们没有找到命令

宙斯


结论:在sh'…'中必须小心使用\n在Jenkinsfile的第节中,对于注释或实际代码行,否则将看到命令NotFound错误。或者,最好通过一些版本控制工具GIT中提供的脚本调用上述代码行,而不是将所有这些代码行放在Jenkins文件中。

我认为这不是问题所在。您的shell脚本只有20行,因此最后一行的某些内容导致-被视为一个命令,而不是一个回显的参数。。Jenkinsfile在处理Shell代码bash和Jenkinsfile的\n时,使用了一种奇怪的方式来处理这个字符,即在解析步骤中,它会将这个脚本的\n字符和\n字符后面的任何字符分解成一行新的代码。如果一个命令没有被注释掉,即echo\n-giga将工作,因为它将把它分成一行echo,然后是另一行'-giga',工作正常。当它是echo\n-giga时,它会呕吐,因为echo本身被注释掉了&-is failing noecho@chepner它并不是纯粹在Jenkinsfile Groovy中解析SHELL代码。如果我在代码中set+x之后添加cat-n$0,就可以测试这一点,它在Shell执行之前是如何显示的。很高兴知道这是怎么回事,我不认为评论是个问题。您的shell脚本只有20行,因此最后一行的某些内容导致-被视为一个命令,而不是一个回显的参数。。Jenkinsfile在处理Shell代码bash和Jenkinsfile的\n时,使用了一种奇怪的方式来处理这个字符,即在解析步骤中,它会将这个脚本的\n字符和\n字符后面的任何字符分解成一行新的代码。如果一个命令没有被注释掉,即echo\n-giga将工作,因为它将把它分成一行echo,然后是另一行'-giga',工作正常。当它是echo\n-giga时,它会呕吐,因为echo本身被注释掉了&-is failing noecho@chepner它并不是纯粹在Jenkinsfile Groovy中解析SHELL代码。如果我在代码中set+x之后添加cat-n$0,就可以测试这一点,它在Shell执行之前是如何显示的。很高兴知道它现在是如何工作的
10:38:38 -- Checking out dependent code:
10:38:38 
10:38:38 -- Cloning Common Code.
10:38:38 
10:38:38 Cloning into 'common_utilities'...
10:38:39 
10:38:39 -- Cloning Exporter Tool
10:38:39 
10:38:39 Cloning into 'jira-exporter'...
10:38:39 /jenkins_workspaces/workspace/development/project/my_jenkins_job/251@tmp/durable-f88d4c2a/script.sh: line 21: --: command not found
stages {
     stage("Checkout Dependent Code") {
         steps {
             sh  '''
                 set +x
                 printf '\n-- Checking out dependent code:\n'

                 printf '\n-- Cloning Common Code.\n\n'
                 git clone -b "${COMMON_REPO_BRANCH}" ${SSH_GIT_URL}/project/common_utilities.git

                 ## Comment 1. Old repo
                 printf '\n-- Cloning Exporter Tool\n'
                 git clone -b "${TOOL_REPO_BRANCH}" "${SSH_GIT_URL}/project/jira-exporter.git"

                 ## Comment 2. New - 3 new repos. Comment the code for now.
                 #echo -e "\n-- Cloning Some Exporter Tool Repos\n"
                 #for r in core client extractor;
                 #do
                 #    echo -e "\n   -- Cloning: ${r}"
                 #    git clone -b ${TOOL_REPO_BRANCH} ${SSH_GIT_URL}/project/${r}.git
                 #    echo
                 #done

                 printf '\n\n\n-- Current Directory '
                 pwd
                 printf '\n'
                 ls -l
                 printf '\n\n'
             '''
         }
     }
 }
10:38:38     19                         ## Comment 2. New - 3 new repos. Comment the code for now.
10:38:38     20                         #echo -e "
10:38:38     21 -- Cloning Some Exporter Tool Repos
10:38:38     22 "