Sourcing .bashrc в Travis-CI не работает - PullRequest
0 голосов
/ 10 июля 2019

Последние пару дней я пытался настроить сборку Travis-CI для моего проекта сценариев bash. У меня проблема с введением псевдонима в .bashrc, который живет в сборке Трэвиса, а не из источников.

Ниже приведен мой простой пример создания псевдонима bash в файле .bashrc в Linux и неудачной попытки.

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:

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

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 

Что я получаю из вывода моей сборки, так это:

$ 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.

Я ожидал, что все тесты пройдут, но мне сложно понять такую ​​простую функцию. Единственное, о чем я могу думать, это то, что версия BASH имеет версию, псевдоним которой не поддерживается. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 10 июля 2019

вы можете работать с простыми переменными или выполнять их через eval, что соответствует тому, что вы хотите.

Найдите name2 и два варианта с eval и без него.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

при запуске скрипта вы можете увидеть:

$ ./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' ']'
  • 1-й вывод пуст, поскольку псевдоним не расширяется (как сказал Чепнер)
  • 2-й выход настроен на «Джон Доу», но эхо запускается напрямую. (обратите внимание на " внутри значения переменной)
  • 3-й выход также настроен на "Джон Доу", но через eval, который запускает эхо.Иногда это важно при создании имен переменных с другой переменной.

this 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
...