Você pode usar eval
:
eval "$(./settings)"
eval "'./settings'"
É meio complicado nomear isso ...
Basicamente eu tenho um programa que quando executado imprime no STDOUT um conjunto de variáveis shell:
$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".
Eu quero rodar isso de dentro de um script shell como se o STDOUT estivesse sendo avaliado com source
.
Eu gostaria de fazer algo como ...
source './settings'
... mas é claro que isso não funciona.
Eu sei que posso fazer:
./settings >/tmp/file
source /tmp/file
mas eu realmente não quero fazer isso.
Alguma pista?
Em sistemas em que /dev/fd
está disponível, o bash suporta a substituição de processos:
source <(./settings)
Aqui, <( )
expandirá para um caminho atribuído automaticamente sob /dev/fd/...
, a partir do qual a saída de ./settings
pode ser lida.
declare './settings'
Ou, claro ...
export './settings'
Teste claro ...
export 'echo -e "asdf=test\nqwerty=dvorak"' ; echo $asdf $qwerty
Como lidar com espaços em branco:
eval export './settings'
source /dev/stdin < ./settings
Eu acho que o / dev / stdin é apenas uma coisa do Linux.
Tags sh