2014-11-28 3 views
0

Я пытаюсь выполнить скрипт bash для запуска нескольких git-команд в последовательности, чтобы обновить репозиторий. Команда, которую я конкатенирую в конце, работает, если я вручную ввожу ее в терминал, но внутри скрипта bash он ничего не делает. Какова синтаксическая ошибка bash, которую я создаю?Bash-скрипт для выполнения git-обновления

cmd1="cd $myGitRepo" 
cmd2="git add --all" 
cmd3="git commit -m \"test commit msg\"" 
cmd4="git push" 
cmd="$cmd1 && $cmd2 && $cmd3 && $cmd4" 
echo "$cmd" 
$cmd 

ответ

2

Когда они сталкиваются с проблемой, как это, используйте инструменты отладки, такие как эхо отладчик, или -x флаг:

bash-3.2$ cmd="echo foo && echo bar" 
bash-3.2$ $cmd 
foo && echo bar 
bash-3.2$ 

Это показывает, что && не рассматривается как синтаксис, когда он результат переменной оболочки. Эквивалентное:

bash-3.2$ set -x 
bash-3.2$ $cmd 
+ echo foo '&&' echo bar 
foo && echo bar 
bash-3.2$ 

Флаг -x сообщает оболочке, чтобы распечатать каждую команду, поставив перед ним + маркером, перед его запуском.

(Вы можете получить это лечение как синтаксис, добавив eval впереди, но в целом это не очень хороший план.)

Есть ли какая-то причина, чтобы не просто писать реальные команды, которые необходимо сделать, например, :

cd $myGitRepo && git add --all && git commit -m "test commit msg" && git push 

как тело вашего скрипта?

Если вы хотите автоматически выйти после команды сбоя, sh и bash поддерживают set -e; bash дает это дополнительное имя errexit (как опция -o). Так set -e говорит оболочке выйти немедленно, если любой из простых команд не в состоянии: (. Чтобы закончить -e поведение, просто set +e)

set -e 
cd $myGitRepo 
git add --all 
git commit -m "test commit msg" 
git push 

Смежные вопросы