Другая версия bash, работающая на git, предварительно фиксирует на Ubuntu? - PullRequest
1 голос
/ 11 июня 2019

Я использую Ubuntu 18.04 вместе с некоторыми предварительными коммитами Git 2.17.1.Я установил zsh в качестве оболочки по умолчанию, используя chsh .Каждый раз, когда происходит фиксация, набор команд yarn выполняется для запуска и модульного тестирования кода Javascript.Сценарий yarn в package.json , который выполняет проверку lint:

read -r CHANGES <<< `git diff-index --name-only HEAD | grep 'workspaces/.*/\\(src\\|test\\)/.\\+\\.jsx\\?$' | tr '\\n' ' '`; if [[ $CHANGES ]]; then yarn eslint ${CHANGES}; fi;

Когда пряжа пытается выполнить это, я получаю ошибку Syntax error: redirection unexpected.Если я возьму ту же команду и запусту ее прямо из приглашения zsh , она будет работать нормально.

Файл ловушки перед фиксацией выглядит следующим образом:

#!/bin/bash
./node_modules/pre-commit/hook
RESULT=$?
[ $RESULT -ne 0 ] && exit 1
exit 0

и файл ловушек в node_modules выглядит следующим образом:

#!/bin/bash

HAS_NODE=`which node 2> /dev/null || which nodejs 2> /dev/null || which iojs 2> /dev/null`

#
# There are some issues with Source Tree because paths are not set correctly for
# the given environment. Sourcing the bash_profile seems to resolve this for bash users,
# sourcing the zshrc for zshell users.
#
# https://answers.atlassian.com/questions/140339/sourcetree-hook-failing-because-paths-don-t-seem-to-be-set-correctly
#
function source_home_file {
  file="$HOME/$1"
  [[ -f "${file}" ]] && source "${file}"
}

if [[ -z "$HAS_NODE" ]]; then
  source_home_file ".bash_profile" || source_home_file ".zshrc" || source_home_file ".bashrc" || true
fi

NODE=`which node 2> /dev/null`
NODEJS=`which nodejs 2> /dev/null`
IOJS=`which iojs 2> /dev/null`
LOCAL="/usr/local/bin/node"
BINARY=

#
# Figure out which binary we need to use for our script execution.
#
if [[ -n "$NODE" ]]; then
  BINARY="$NODE"
elif [[ -n "$NODEJS" ]]; then
  BINARY="$NODEJS"
elif [[ -n "$IOJS" ]]; then
  BINARY="$IOJS"
elif [[ -x "$LOCAL" ]]; then
  BINARY="$LOCAL"
fi

#
# Add --dry-run cli flag support so we can execute this hook without side affects
# and see if it works in the current environment
#
if [[ $* == *--dry-run* ]]; then
  if [[ -z "$BINARY" ]]; then
    exit 1
  fi
else
  "$BINARY" "$("$BINARY" -e "console.log(require.resolve('pre-commit'))")"
fi

Есть другие пользователи, использующие OSX, которые также запускают эти ловушки, и он работает для них.Есть ли способ заставить это работать на Ubuntu? yarn или git работает ли какая-либо другая версия bash / dash , которая вызывает ошибку перенаправления, и если да, могу ли я это изменить?

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Скорее всего, используемый вами скрипт пряжи на самом деле запускается /bin/sh, который в Ubuntu равен dash, а не bash или zsh. Большинство программ, которые вызывают оболочку, будут вызывать только /bin/sh, игнорируя вашу личную оболочку. Это важно, потому что у пользователя может быть оболочка, такая как tcsh, которая не совместима с POSIX, и сценарии в противном случае завершатся с ошибкой.

В dash здесь-строки (синтаксис <<<) недоступны, поэтому вам, вероятно, придется переключить этот синтаксис, чтобы использовать вместо него эхо. Также обратите внимание, что запись в двойных скобках является башизмом и вряд ли сработает, поэтому вы должны заменить ее одинарными скобками и кавычками вокруг переменной.

0 голосов
/ 12 июня 2019

Получив ответ от bk2204, я еще немного покопался о том, как изменить оболочку, которая вызывается любым процессом. Я нашел AskUbuntu ответ об изменении оболочки Ubuntu. Как только я это сделал, пре-коммиты правильно работают.

...