简体   繁体   English

在Travis-CI中采购.bashrc无法正常工作

[英]Sourcing .bashrc in Travis-CI not working

The last couple of days I've been trying to setup a Travis-CI build for my bash scripting project. 最近几天,我一直在尝试为bash脚本项目设置Travis-CI构建。 I am having a problem with sticking an alias into the .bashrc that lives in the Travis build and not sourcing. 我在将别名粘贴到生活在Travis构建中而不是进行采购的.bashrc中时遇到问题。

Below is my simple example of creating a bash alias in the .bashrc file on Linux, and the attempt failing. 下面是我在Linux上的.bashrc文件中创建bash别名的简单示例,但尝试失败。

Travis-CI (.travis.yaml): Travis-CI(.travis.yaml):

language: bash

git:
  quiet: true
  submodules: false

matrix:
  include:
    - os: linux
      dist: xenial

script:
  - sh test_bash.sh || travis_terminate 1;
  - bash test_sourcing.sh || travis_terminate 1;

test_bash.sh: test_bash.sh:

current_shell=$(echo $SHELL)
if [ "$current_shell" != "/bin/bash" ]; then
    echo "The current build is not working with the Bash Shell."
    exit 1
fi 

test_sourcing.sh test_sourcing.sh

alias name='echo "John Doe"' >> $HOME/.bashrc
source $HOME/.bashrc
output=$(name)
if [ "$output" != "John Doe" ]; then
    echo "Sourcing is not working for some reason."
    exit 1
fi 

What I get from the output of my build is the following: 从构建输出中得到的内容如下:

$ bash -c 'echo $BASH_VERSION'
3.2.57(1)-release
0.02s$ sh test_bash.sh || travis_terminate 1;
The command "sh test_bash.sh || travis_terminate 1;" exited with 0.
$ bash test_sourcing.sh || travis_terminate 1;
test_sourcing.sh: line 3: name: command not found
Sourcing is not working for some reason.

I expected to get all tests to pass but I am having a hard time understanding such a simple feature. 我希望所有测试都能通过,但是我很难理解这样一个简单的功能。 The only thing I can think of is that the version of BASH is at a version that alias is not supported. 我唯一能想到的是BASH的版本是不支持别名的版本。 Thanks for any help! 谢谢你的帮助!

you could work with simple variables or execute them through eval , which is simlar to what you want. 您可以使用简单变量,也可以通过eval执行它们,这与您想要的类似。

Look for name2 and the two options with and without eval . 查找name2和带有和不带有eval的两个选项。 name1 is your code. name1是您的代码。

$ cat test_sourcing.sh
set -x
alias name1='echo "John Doe"' >> $HOME/.bashrc
name2='echo "John Doe"' >> $HOME/.bashrc
source $HOME/.bashrc
output=$($name1)
output=$($name2)
output=$(eval $name2)
if [ "$output" != "John Doe" ]; then
    echo "Sourcing is not working for some reason."
    exit 1
fi

when running the script you can see: 运行脚本时,您可以看到:

$ ./test_sourcing.sh
++ alias 'name1=echo "John Doe"'
++ name2='echo "John Doe"'
++ source /home/schroen/.bashrc
+++ case $- in
+++ return
++ output=
+++ echo '"John' 'Doe"'
++ output='"John Doe"'
+++ eval echo '"John' 'Doe"'
++++ echo 'John Doe'
++ output='John Doe'
++ '[' 'John Doe' '!=' 'John Doe' ']'
  • 1st output is empty, because alias is not expanding (like chepner said) 第一个输出为空,因为别名没有扩展(例如chepner说)
  • 2nd output is set to "John Doe" but echo is run directly. 第二个输出设置为“ John Doe”,但直接运行echo。 (mind the " inside the variable value) (注意变量值内的"
  • 3rd output is set to "John Doe" too, but via eval which runs the echo. 第三输出也设置为“ John Doe”,但通过运行回显的eval进行。 Sometimes this is important when building variablenames with other variable. 有时在与其他变量一起构建变量名时,这一点很重要。

this eval thing... eval的事情...

$ cat variable-loop.sh
#!/usr/bin/env bash
#set -x

dev1=foo
dev2=bar
dev3=foobar

echo 'without eval not what we want...'
for i in $(seq 1 3); do
        echo dev$i
        echo $dev$i
done

echo 'with eval it is working...'
for i in $(seq 1 3); do
        eval echo \$dev$i
done

$ ./variable-loop.sh 
without eval not what we want...
dev1
1
dev2
2
dev3
3
with eval it is working...
foo
bar
foobar

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM