Запись в терминальную среду из bash или узла - PullRequest
0 голосов
/ 27 июня 2018

Цель

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

Пример

package.json

"scripts":{
   "fillVars": "source theThing.bs",
   "echoVarsHoursLater": "echo $theSize" //etc
}

theThing.bs

read -p "Size: " theSize
read -p "Shape: " theShape
read -p "Color: " theColor

Примечания

И тогда я бы хотел, чтобы эти env-переменные были доступны для любых скриптов или кода, запускаемых впоследствии с того же терминала. НЕ ТОЛЬКО из этого сценария. также НЕ откуда-либо в ОС, если это возможно (также как другие терминалы или сеансы).

Я знаю, что, если я просто получу исходный текст от Thing.bs непосредственно в терминале, я смогу заставить его работать Но я не могу понять, как пройти часть сценария npm.

Это в основном удобный инструмент, но он действительно полезен для этого процесса.

1 Ответ

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

Модель среды UNIX делает невозможным то, что вы делаете, без взаимодействия с родительским процессом. Дочерний процесс не может по соображениям безопасности напрямую манипулировать окружением своего родителя, включая его env-переменные. Обычное решение для дочернего процесса - написать последовательность операторов оболочки, которые устанавливают переменные env и имеют родительскую оболочку "eval" команду. Например, если вы написали скрипт оболочки с именем my_env_init, который сделал

echo export MY_SIZE=42

Вы бы сказали пользователю набрать

eval $(my_env_init)

То, что вы пытаетесь сделать, в принципе невозможно, когда у вас есть произвольные слои посередине, как в программе NPM. Так как он также должен собрать команды, написанные вашим скриптом установки env, и вывести их в оболочку верхнего уровня. Вы делаете это неправильно, но никто не сможет дать правильный ответ, потому что ваш вопрос не объясняет, почему вы пытаетесь это сделать.

...