Проблема в том, что, используя |
, вы запускаете две команды (назначение VAR
и команду sudo
, использующую ее )в отдельных подоболочках, поэтому вы устанавливаете переменную в оболочке при попытке использовать ее в другой.
Кроме того, на самом деле нет необходимости в конвейере, так как вы на самом деле не передаете никакого вывода из первой команды на стандартный ввод второй(ls
ничего не принимает на стандартный ввод.)
Просто заменив |
на ;
, вы должны это сделать. (Использование &&
также было бы неплохо,с тех пор он выполняет часть sudo
только в том случае, если команда, генерирующая содержимое переменной, завершается успешно.)
Обратите внимание, что вам нужно, чтобы они были в одной строке, так как make
обычно создает оболочку для каждой отдельной строки в рецепте. Вам нужно, чтобы оба работали в одной и той же оболочке, иначе вы установите VAR
из одной оболочки и попытаетесь использовать ее из отдельной оболочки, что снова не сработает.
awsecrpush:
VAR=$$( sudo echo "ls -lah" ) && bash -c "sudo -s $$VAR"
Другая возможность — использовать вместо этого переменную Make. Это несколько более гибко, поскольку вам, возможно, не нужно так сильно беспокоиться о подоболочках.
Предполагая, что у вас есть GNU make, вы можете использовать функцию оболочки для запуска первой команды и сохранения ее вывода в переменной Make.
awsecrpush:
VAR := $(shell sudo echo "ls -lah")
sudo -s $(VAR)