Jenkins将单引号添加到Bash shell脚本

10

我的shell脚本长这样:

#!/bin/bash
USER=$1
sudo rm -rf /home/$USER/system/logs/*
exit 0

它已经在shell文件夹中提交到cvs,Jenkins通过“执行Shell”构建步骤配置为在Linux机器上执行该作业:

bash -ex shell/clear-logs.sh myuser

但是Jenkins将整个sudo行用单引号括起来,这导致我的日志文件未被删除(尽管Jenkins作业成功通过):

然而,Jenkins将整条sudo命令使用单引号包含在内,这会导致我的日志文件没有被删除(虽然Jenkins作业成功通过):

[workspace] $ /bin/sh -xe /tmp/hudson7785398405733321556.sh
+ bash -ex shell/clear-logs.sh myuser
+ USER=myuser
+ sudo rm -rf '/home/myuser/system/logs/*'
+ exit 0

有什么想法可以解决 Jenkins 出现这种情况的原因吗?如果我以 root 用户身份从 Jenkins 工作空间位置调用脚本,则它可以正常工作。

编辑:

我在同一台 Linux 服务器上,由 Jenkins 执行不同的 CVS 模块中具有相同 Shell 脚本。已创建一个新任务,无论是自由风格还是通过复制此功能正常的现有任务,但没有任何区别。


你尝试过自己用双引号括起来路径吗?这样可能会阻止Jenkins添加单引号并进行插值处理。 - Gerold Broser
1
双引号包含的路径仍会导致 Jenkins 在单引号中运行整个命令。 - shuttsy
有任何可用于删除的日志吗?如果通配符未能匹配任何文件,则会将其视为字面量,并且跟踪输出将引用该模式以强调这一事实。 - chepner
我需要确保我的“jenkins”用户对“myuser”位置具有权限/访问权限吗?如果是这样,我应该检查什么? - shuttsy
3个回答

3

好的,似乎通过将“jenkins”用户添加到“myuser”组并重新启动jenkins服务解决了这个问题。如果日志目录为空,则Jenkins控制台输出报告单引号中的路径,因为没有找到文件。但是第二次运行作业时有文件,没有单引号,文件被正确删除。


1
Jenkins不会对引号进行任何处理,例如将双引号更改为单引号-您看到的是“set -x”的输出。请在您的shell中尝试此操作:
set -x
ls "some string with spaces"

输出将会是类似下面的内容:
+ ls --color=auto 'some string with spaces'

"

bash 只是展示了它解释和分词你的命令的调试输出。

"

这根本不是被问到的内容。 - Matt
1
他正在解释单引号来自哪里,指出当echo参数带有空格时,Bash本身会添加它们。但实际上这并不是全部的故事。在他的情况下,他原本期望Bash执行通配符扩展,而不是将最后一个'sudo'参数视为字面量。 - Spidey

0

调整/home/$USER/...的权限。一开始在控制台输出中我得到了以下内容:

+ USER=geri
+ rm -rf '/home/geri/so-30802898/*'
rm: cannot remove ‘/home/geri/so-30802898/*’: Permission denied
Build step 'Execute shell' marked build as failure

在适应权限之后,构建/删除成功。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接