Bash Несколько операторов -execdir или -exec НЕ РАБОТАЮТ при разделении на несколько строк для правильного форматирования кода - PullRequest
0 голосов
/ 08 ноября 2018

Как я уже указывал в вопросе, у меня должно быть несколько команд для выполнения в подкаталоге, когда find видит, что в этом подкаталоге существует определенный каталог.

Теперь, когда у меня есть только один оператор -execdir в предложении find, он работает так же, как показано ниже:

find $repoFolder -type d -name '*.git' \
    -execdir git config --global credential.helper manager{}/.git \;

НО, когда у меня несколько операторов -execdir, и если я разделю их на несколько строк, чтобы код выглядел прилично, он не работает, что вообще не имеет смысла, он ДОЛЖЕН работать:

find $repoFolder -type d -name '*.git' \
    -execdir git config --global credential.helper manager{}/.git \; \
    -execdir curr_branch=$(git rev-parse --abbrev-ref HEAD){}/.git \; \
    -execdir git checkout master && git remote prune origin{}/.git \; \
    -execdir git pull && git pull origin{}/.git \; \
    -execdir git checkout $curr_branch && git merge master{}/.git \;

Может кто-нибудь помочь выяснить, почему он выдает следующую ошибку?

fatal: not a git repository (or any of the parent directories): .git
find: missing argument to `-execdir'
fatal: not a git repository (or any of the parent directories): .git
find: missing argument to `-execdir'
....

1 Ответ

0 голосов
/ 08 ноября 2018

Есть две проблемы.Во-первых, каждый -execdir выполняет свою команду в новом процессе оболочки;curr_branch не определено вне его собственной оболочки.Во-вторых, && завершает команду find (преждевременно, поскольку \; не было найдено).

Вам необходимо объединить все в одну составную команду оболочки для использования с одной -execdirprimary.

find "$repoFolder" -type d -name '*.git' \
  -execdir sh -c '
      git config --global credential.helper manager"$1"/.git;
      curr_branch=$(git rev-parse --abbrev-ref HEAD)"$1"/.git;
      git checkout master && git remote prune origin"$1"/.git;
      git pull && git pull origin"$1"/.git;
      git checkout $curr_branch && git merge master"$1"/.git' _ {} \;

Непонятно, как вы на самом деле используете имя каталога в каждой команде;Я просто заменил каждое использование {} на "$1", как оно было найдено;это может работать не так, как вы хотите.

...