/ bin / sh source de stdin (de outro programa) não arquivo

10

É 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?

    
por Majenko 18.04.2011 / 22:11

4 respostas

10

Você pode usar eval :

eval "$(./settings)"

eval "'./settings'"
    
por 18.04.2011 / 22:15
11

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.

    
por 18.04.2011 / 22:23
5
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'
    
por 18.04.2011 / 22:22
0

source /dev/stdin < ./settings

Eu acho que o / dev / stdin é apenas uma coisa do Linux.

    
por 18.04.2011 / 22:17

Tags