Я пытаюсь в течение нескольких часов и исследую, как передать переменную оболочки, возвращаемую из Pythonscript, в другой сценарий оболочки для запуска другого сценария Python.
У меня есть пример ниже:
MyRule:
export VAR=$(shell python.exe mySkript1.py someInputs); \
echo $$VAR; \
$(shell python.exe mySkript2.py someInputs2 $VAR}) \
echo $$VAR;
Как передать переменную VAR во вторую строку оболочки?
Я попробовал следующее, но ни один из них не сделал этого:
"$VAR"
$$VAR
$(VAR)
.
Когда я использую $$VAR, я получаю предупреждение: неопределенная переменная 'VAL'
«Когда я использую $$VAR, я получаю предупреждение: неопределенная переменная 'VAL» - ваш рецепт предполагает, что вы используете make
с оболочкой POSIX, такой как Bash, в качестве SHELL
, но ни Bash, ни make
не жалуются на ссылки к неопределенным переменным. Если оболочка под ней на самом деле представляет собой PowerShell, вам нужно писать свои рецепты в PowerShell (или переключиться на Bash).
Переменная Makefile $VAR
отсутствует, поэтому она заменяется пустой строкой.
В любом случае, не используйте $(shell ...)
в рецептах.
MyRule:
export VAR=$$(python.exe mySkript1.py someInputs); \
echo $$VAR; \
python.exe mySkript2.py someInputs2 "$$VAR"; \
echo "$$VAR"
Здравствуйте, в основном код работает, когда я не использую «$$VAR» в качестве параметра. Но при использовании параметра «$$VAR» в качестве параметра я получаю сообщение об ошибке «команда не найдена». Как я могу это исправить?
Я удалил кавычки "". Теперь это работает!.
Похоже, у вас где-то есть дополнительные ошибки. Возможно, посмотрите Когда заключать переменную оболочки в кавычки?
Вы можете использовать переменные make и сделать:
VAR=$(shell python.exe mySkript1.py someInputs)
MyRule:
python.exe mySkript2.py someInputs2 "$(VAR)"
В версии GNU-Make, которую я сейчас использую, VAR не расширяется, если это не необходимо, поэтому запуск других рецептов не обязательно приведет к ненужному выполнению python.exe, но я не уверен, что другие версии make будут делать.
Будет ли это хорошей идеей для вашего варианта использования, будет зависеть от того, будет ли это хорошей идеей для вашего варианта использования.
Этот вариант немного рискован. Если VAR
в конечном итоге будет содержать символы "
, символы $
или некоторые другие вещи, то они будут обработаны оболочкой, а не восприняты как литералы. Ситуацию можно было бы улучшить, но не решить полностью, если бы заключить расширение $(VAR)
в одинарные кавычки вместо двойных. То же самое нельзя сказать о захвате вывода первого сценария в переменной оболочки и предоставлении оболочке возможности его расширения (внутри двойных кавычек).
Почему вы используете
$(shell)
для запуска команд оболочки в рецептеmake
? Команды в рецептеmake
уже выполняются через оболочку, и ваш второй рецепт, в частности, скорее всего, выдаст недопустимый рецепт. Но кроме того,$(shell ...)
во втором$VAR
расширяется$(shell ...)
, а не оболочкой, поэтому он не видит переменную среды, добавленную ранее в рецепте. Измените это наmake
, как в ваших командах$$VAR
.