1

Я пытаюсь настроить задачу cron для запуска регрессионных тестов для программного обеспечения, которое обычно работает в интерактивной среде (CASA, для любопытных: http://casa.nrao.edu/). У меня есть сценарий оболочки, который в форме MWE (mwe.sh) делает:

casapy -c mwe.py

где предполагается выполнить этот скрипт. casapy - довольно сложный бизнес, который много чего делает внутри, включая импорт и настройку клиента ipython для многопроцессорной обработки.

Вот моя проблема: если я запускаю код в интерактивном режиме, то есть casapy -c mwe.py в командной строке оболочки bash, это работает. Если я бегу:

source mwe.sh

код по-прежнему работает точно так, как ожидалось, и выполняет тесты. Большой!

Если вместо этого я бегу

bash mwe.sh

скрипт запуска зависает постоянно. Я проследил это до нескольких разных мест в скрипте запуска, которые все могут работать независимо друг от друга.

Итак, мой вопрос: каковы различия между командами запуска в среде интерактивной оболочки и внутри скрипта? В частности, какие различия можно сузить до различий между source file.sh и sh file.sh?

В частности, в контексте задания cron, которое я пытаюсь запустить, есть ли способ сделать эквивалент source файла в интерактивной командной строке?

РЕДАКТИРОВАТЬ: последний кусок информации - я думаю, что эта ошибка происходит только на Mac, а не на Linux, но я не знаю, предоставляет ли она вообще какую-либо полезную информацию, потому что основной код несколько отличается для двух платформ.

2 ответа2

1

Различия между командами запуска в среде интерактивной оболочки или внутри скрипта - это среда.

Чтобы увидеть различия между source foo.sh и sh foo.sh вы должны знать, что происходит в любом случае:

  1. source foo.sh:

source это встроенная команда только для bash. Это означает, что когда вы вызываете source , нет исполняемого файла, такого как /bin/source или около того. Сам bash анализирует интерфейс командной строки для так называемых встроенных команд оболочки. source команда является встроенной функцией bash для ...

читать и выполнять команды из имени файла в текущей среде оболочки и возвращать состояние выхода последней команды, выполненной из имени файла.

Это похоже на случай, когда вы просто копируете и вставляете строку за строкой в свой файл foo.sh и нажимаете Enter после каждой строки. Если bash не запущен, то также нет source команды.

  1. sh foo.sh:

Это вызывает оболочку по умолчанию /bin/sh с аргументом, command_file. Это путь к файлу, содержащему команды. Этот файл не обязательно должен быть исполняемым. И нет также необходимости в хэшбэнг- линии. Итак, запускается новая оболочка (/bin/sh), и в этой новой оболочке команды в файле выполняются построчно. Но теперь среда не является текущей средой оболочки. Это среда, созданная оболочкой.

1

source foo.sh запускает скрипт в текущей оболочке Bash, очень похоже на простую замену исходной команды source foo.sh содержимым файла foo.sh sh foo.sh запускает скрипт в контексте новой оболочки sh, которая во многих ОС даже не является Bash (что может быть одной из причин, по которой скрипт не работает).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .