Самоопределенная команда bash работает в терминале, но не в скрипте - PullRequest
0 голосов
/ 04 июня 2018

У меня есть два сценария:

fail_def.sh:

#!/bin/bash -eu
function fail() {
  echo -e "$(error "$@")"
  exit 1
}

bla.sh:

#!/bin/bash -eu
fail "test"

После source fail_def.sh я могу использовать сбойКоманда без проблем в терминале.Однако, когда я звоню bla.sh, я всегда получаю line 2: fail: command not found.

Неважно, звоню ли я через ./bla.sh или через bash bla.sh или через bash ./bla.sh, ошибка остается.

Добавление source fail_def.sh в начало bla.sh решает проблему, но я бы хотел этого избежать.

Я работаю над док-контейнером Ubuntu, работающим на Mac,в случае, если это уместно.

Я попытался найти эту проблему в Google и обнаружил некоторые похожие проблемы, но большинство из них, похоже, связано либо с неискусством файла, либо со смешиванием различных реализаций оболочки, ни одна из которых не кажетсяздесь дело обстоит именно так.

Что мне нужно сделать, чтобы команда fail работала внутри скрипта?

1 Ответ

0 голосов
/ 04 июня 2018

Ожидается!

Оболочка запускает сценарий, выполняемый с разделителем she-bang, всегда как отдельный процесс и , следовательно, в другом пространстве имен оболочки.Новая оболочка, в которой работает ваш скрипт, не имеет функции source'd.

Для отладки такой информации добавьте строку echo $BASHPID, которая печатает идентификатор процесса текущего процесса bash в скрипте bla.shпосле строки #!/bin/bash -eu и результата теста

$ echo $BASHPID
11700
$ bash bla.sh
6788
fail.sh: line 3: fail: command not found

Это сценарии, которые вы запускали в отдельном процессе, в котором импортированные функции не используются совместно.Одним из способов будет ваша собственная обработка ошибок во втором сценарии и исходный код второго сценария.На втором скрипте

$ cat fail.sh
echo $BASHPID

set -e
fail "test"
set +e

Теперь он выполняется

$ source fail.sh
11700
11700
bash: error: command not found

, что очевидно, поскольку error не является встроенной оболочкой, которая доступна.Наблюдайте за идентичным идентификатором процесса в приведенном выше случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...