Вроде сложно назвать это ...
В основном у меня есть программа, которая при запуске печатает на STDOUT набор переменных оболочки:
$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".
Я хочу запустить это из сценария оболочки, как если бы STDOUT оценивался с source
.
Я хотел бы сделать что-то вроде ...
source `./settings`
... но, конечно, это не работает.
Я знаю, что мог сделать:
./settings >/tmp/file
source /tmp/file
но я действительно не хочу этого делать.
Есть какие-нибудь подсказки?
sh
- это может быть символическая ссылка на dash, ash, busybox ... Я не видел копию "настоящего 'sh'" вживую.$( )
- начиная с оболочки Almquist в 4.3BSD - и это тоже POSIX. (Примечание: не спорю, просто любопытно.)В системах, где
/dev/fd
доступно, bash поддерживает подстановку процессов:Здесь
<( )
расширится до автоматически назначенного пути, по/dev/fd/...
которому./settings
можно прочитать выходные данные .источник
Или конечно ...
Проверьте это конечно ...
Обработка пробелов:
источник
export
трюк работает! Спасибоa backtick --> ` <--
and here's another one --> ` <--
source /dev/stdin < ./settings
Я думаю, что / dev / stdin - это единственная вещь для Linux.
источник
/dev/stdin
работает на BSD и Cygwin тоже.|
, однако, не будет работать (по крайней мере, не совсем), потому что обе стороны канала являются отдельными подпроцессами, поэтому полученные команды не будут влиять на текущую оболочку./dev/stdin
трюк, но то, что делает ваш ответ, на самом деле эквивалентно простому,source ./settings
не выполняя его. Можно было бы использовать документ-здесь , чтобы преодолеть это:source /dev/stdin <<EOF \n $(./settings) \n EOF
.Хотелось представить другую перспективу здесь, так как другие ответы создают файлы и не извлекают напрямую из stdin. У меня есть несколько сборок, которые должны отправить подготовленную информацию о среде в несколько сценариев. То, что я делаю, готовит кучу Bash-совместимых переменных в строке:
Когда я готовлюсь выполнить сценарий, я base64 кодирую приведенную выше многострочную строку и передаю ее в свой сценарий оболочки:
В build.sh я читаю из stdin, base64 декодирую и оцениваю результат.
источник