5

我已经配置了一个 Jenkins 作业来获取一个 bash 脚本,该脚本获取另一个.bashrcbash 脚本,该脚本为其用户添加别名并获取.bashrc自身,然后原始脚本尝试使用该别名(由第二个设置)。但是,它似乎找不到它刚刚创建的别名。除了使用“发送文件或通过 SSH 执行命令”构建步骤来获取脚本之外,我没有使用任何脚本插件。

这项工作是这样做的:

source ./test_script.sh

test_script.sh看起来像这样:

echo "In test_script.sh"
echo $USER
echo $HOME
source ./setup_env.sh
echo "\nBack in test_script.sh"
alias foo
foo

最后,setup_env.sh看起来像这样:

echo "\nIn setup_env.sh"
echo "alias foo=\"echo foobar\"" >> $HOME/.bashrc
source $HOME/.bashrc 2>/dev/null
cat $HOME/.bashrc

我从 Jenkins 工作中收到的输出如下所示:

In test_script.sh
my_user
/home/my_user
\nIn setup_env.sh
...all of my bashrc...
alias foo="echo foo"
\nBack in test_script.sh
alias foo='echo foo'
./test_script.sh: line 7: foo: command not found

我不明白为什么会这样,当我可以自己在命令行上愉快地运行它并看到它成功时。为什么 Jenkins 不能使用新别名,而它显然可以找到它(如alias foo命令的输出所示)?

4

2 回答 2

19

对于遇到此问题的其他任何人,您可能需要设置expand_aliasesshell 选项,该选项在 Jenkins 中似乎默认为关闭:

shopt expand_aliases # check if it's on
shopt -s expand_aliases # set expand_aliases option to true
shopt expand_aliases # it should be on now

# test with a simple alias, should print 1
alias x="python -c 'print 1'"
x
于 2016-05-04T20:47:37.977 回答
4

如您所料,您的命令\n输出中显示的内容 表明它未在 下运行。echo
bash

请检查您的jenkins用户(或您运行Jenkins
的 任何其他用户)的设置 - 特别是默认 shell的设置。

要对此进行测试,请在脚本的开头添加其中一行:

env

或者

env | grep -i shell

还应该考虑通过在每个脚本的第一行
添加“ shebang ”行来确保您的脚本在正确的 shell 下运行。
例如,在“bash”的情况下,您应该添加以下第一行:

#!/bin/bash

(这不是评论,尽管自动语法高亮器可能认为......)

于 2013-08-02T19:15:21.460 回答