Исследовать сценарий bash, когда он останавливается без ошибок

Я пытаюсь автоматизировать установку 4 проектов, и у меня возникла проблема с bash, которую я не могу понять. При запуске сценария от имени другого пользователя сценарии останавливаются между 2 шагами, и я не могу думать об этом ...

Во-первых, это скрипт, который работает и успешно устанавливает 4 проекта:

install () {
  set -e
  echo "Install $1"
  git clone git@gitlab.com:xxx/$1.git
  cd $1
  npm i
  echo "Install successful"
  cd ..
}

install router
install web
install backend
install file-storage

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

#!/bin/bash
set -e
sudo su - username <<USER
install () {
  set -e
  echo "Install $1"

  git clone git@gitlab.com:xxx/$1.git
  cd $1
  npm i || echo "Error during install"
  echo "Install successful"
  cd ..
}

install router
install web
install backend
install file-storage
USER

Вот журнал, который он мне дает (с набором -xv). Я подведу итоги ниже.

//...
+ sudo su - username
+ echo 'Install router'
Install router
+ git clone git@gitlab.xxx/router.git
Cloning into 'router'...
remote: Enumerating objects: 60, done.
remote: Counting objects: 100% (60/60), done.
remote: Compressing objects: 100% (35/35), done.
remote: Total 60 (delta 35), reused 35 (delta 23), pack-reused 0
Receiving objects: 100% (60/60), 29.12 KiB | 3.23 MiB/s, done.
Resolving deltas: 100% (35/35), done.
+ cd router
+ npm i

> @root/acme@3.0.9 postinstall /home/username/router/node_modules/@root/acme
> node scripts/postinstall

added 218 packages from 136 contributors and audited 438 packages in 5.894s

2 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

+ echo 'Install successful'
Install successful
+ cd ..
install web
+ install web
+ set -exv
+ echo 'Install web'
Install web
+ git clone git@gitlab.com:xxx/web.git
Cloning into 'web'...
remote: Enumerating objects: 371, done.
remote: Counting objects: 100% (371/371), done.
remote: Compressing objects: 100% (238/238), done.
remote: Total 371 (delta 152), reused 339 (delta 122), pack-reused 0
Receiving objects: 100% (371/371), 31.24 MiB | 9.43 MiB/s, done.
Resolving deltas: 100% (152/152), done.
+ cd web
+ npm i

> core-js@2.6.11 postinstall /home/username/web/node_modules/babel-runtime/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
> https://opencollective.com/core-js 
> https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)


> core-js@3.6.2 postinstall /home/username/web/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"


> core-js-pure@3.6.2 postinstall /home/username/web/node_modules/core-js-pure
> node -e "try{require('./postinstall')}catch(e){}"


> ejs@2.7.4 postinstall /home/username/web/node_modules/ejs
> node ./postinstall.js

Thank you for installing EJS: built with the Jake JavaScript build tool (https://jakejs.com/)


> parse-domain@2.3.4 postinstall /home/username/web/node_modules/parse-domain
> run-s build:tries


> parse-domain@2.3.4 build:tries /home/username/web/node_modules/parse-domain
> node scripts/build-tries.js

Downloading public suffix list from https://publicsuffix.org/list/public_suffix_list.dat... (node:8368) [DEP0066] DeprecationWarning: OutgoingMessage.prototype._headers is deprecated
ok
Writing /home/username/web/node_modules/parse-domain/build/tries/icann.complete.json... ok
Writing /home/username/web/node_modules/parse-domain/build/tries/icann.light.json... ok
Writing /home/username/web/node_modules/parse-domain/build/tries/private.complete.json... ok
Running sanity check... 
Could not update list of known top-level domains for parse-domain because of "Command failed: /usr/bin/node /home/username/web/node_modules/jest/bin/jest.js"
Using possibly outdated prebuilt list from Sat Nov 02 2019

> styled-components@4.4.1 postinstall /home/username/web/node_modules/styled-components
> node ./scripts/postinstall.js || exit 0

Use styled-components at work? Consider supporting our development efforts at https://opencollective.com/styled-components
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.11 (node_modules/jest-haste-map/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.11: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.11 (node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.11: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.1.2 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 1958 packages from 1236 contributors and audited 1816762 packages in 47.021s

52 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

+ echo 'Install successful'
Install successful
+ cd ..

Есть несколько интересных моментов:

  • Установка первого проекта выглядит нормально.
  • Сценарии достигают конца второй установки, но не запускают следующую. Это останавливается без видимой причины.
  • Я пытался изменить порядок установки. Все проекты успешно устанавливаются перед install web , но в конце install web сценарии останавливаются и не выполняют никаких дальнейших команд перед USER .
  • Если я npm i строку npm i проблема исчезнет.
  • Я изменил строку для npm i || echo "Error during install" npm i || echo "Error during install" чтобы убедиться, что npm i не потерпел неудачу, и, как вы можете видеть, это не так.

Я не знаю, что я могу сделать дальше, чтобы глубже расследовать ...

Всего 1 ответ


Я подозреваю, что npm i для второго пакета по какой-то причине читает входные данные (возможно, связанные со всеми выводимыми им предупреждающими сообщениями), поэтому он читает следующие команды install . Перенаправьте его ввод в /dev/null чтобы он не имел доступа к стандартному вводу скрипта.

#!/bin/bash
set -e
sudo su - username <<'USER'
install () {
  set -e
  echo "Install $1"

  git clone git@gitlab.com:xxx/$1.git
  cd $1
  npm i </dev/null || echo "Error during install"
  echo "Install successful"
  cd ..
}

install router
install web
install backend
install file-storage
USER

Кроме того, как уже упоминалось в комментарии, вы можете заключить конечный токен в <<'USER' - он обрабатывает here-doc как строку в одинарных кавычках, так что $ не нужно экранировать.


Есть идеи?

10000