É meio complicado nomear isso ...
Basicamente, eu tenho um programa que, quando executado, imprime no STDOUT um conjunto de variáveis de shell:
$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".
Eu quero executar isso de dentro de um script de shell como se o STDOUT estivesse sendo avaliado source
.
Eu gostaria de fazer algo como ...
source `./settings`
... mas é claro que isso não funciona.
Eu sei que eu poderia fazer:
./settings >/tmp/file
source /tmp/file
mas eu realmente não quero fazer isso.
Alguma pista?
sh
- pode ser um link simbólico para traço, cinzas, busybox ... Eu não vi uma cópia do "the real 'sh'" ao vivo.$( )
- começando pelo shell de Almquist no 4.3BSD - e também pelo POSIX. (Nota:. Não discutindo, apenas curioso)Nos sistemas onde
/dev/fd
está disponível, o bash suporta a substituição de processos:Aqui,
<( )
será expandido para um caminho atribuído automaticamente, no/dev/fd/...
qual a saída de./settings
pode ser lida.fonte
Ou claro ...
Teste, é claro ...
Manipulação de espaço em branco:
fonte
export
truque funciona! Obrigadoa backtick --> ` <--
and here's another one --> ` <--
source /dev/stdin < ./settings
Eu acho que / dev / stdin é apenas uma coisa do Linux.
fonte
/dev/stdin
Também trabalha com BSD e Cygwin.|
, no entanto, não vai funcionar (pelo menos não exatamente), porque os dois lados do canal são subprocessos separados, portanto, os comandos de origem não afetariam o shell atual./dev/stdin
truque, mas o que sua resposta faz é de fato equivalente a uma planíciesource ./settings
sem executá-lo. Pode-se usar um here-document para superar este:source /dev/stdin <<EOF \n $(./settings) \n EOF
.Queria fornecer outra perspectiva aqui, pois as outras respostas criam arquivos e não são extraídas diretamente do stdin. Eu tenho algumas compilações que precisam enviar algumas informações de ambiente preparadas para vários scripts. O que estou fazendo é preparar várias atribuições de variáveis compatíveis com o Bash em uma string:
Quando estou me preparando para executar o script, eu base64 codifico a sequência multilinha acima e a canalizo para o meu shell script:
No build.sh, li no stdin, decodifique a base64 e avalie o resultado.
fonte