Dado o arquivo que você mostra, você deve ser capaz de fazer:
(set -f ; IFS='
' ; env - $(cat /path/to/file) /path/to/your/program
)
Se isso não funcionar, é porque você precisa primeiro formatar o arquivo do ambiente. Aqui está um exemplo:
(set -f ; IFS='
' ; env - $(cat) printenv
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
A princípio pensei que você poderia fazer isso através do shell - mas ele provavelmente configuraria parte do seu próprio ambiente antes de chamar seu programa. Mas posso pelo menos demonstrar que os argumentos estão atribuídos corretamente:
(set -f; IFS='
' ; env - $(cat) sh -c 'echo "$variable3"'
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
value3 an$d s'om\e m"ore
Ainda assim, se você preferir usá-lo, veja como você pode usar o shell:
(echo '$1'; cat; echo '$2') <<\ENV |\
env - sh -s -- 'set -a' printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
###OUTPUT###
PWD=/home/mikeserv/test
SHLVL=1
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
_=/usr/bin/printenv
Observe que eu removi o $IFS
stuff - que não é necessário dessa forma -, mas eu precisava especificar as citações no arquivo. Aqui estou essencialmente .dot
sourcing stdin
- lendo o |pipe
como entrada - mas você pode usar qualquer arquivo. Eu uso set -a
antes de ler o arquivo de entrada para definir a opção --allexport
.
Isso é resultado do uso de bash
sh
- adiciona $PWD
, $SHLVL
e $_
. Com dash
é um pouco melhor. E dash
também não adiciona um monte de exportações, então você pode especificar o parâmetro -a
na linha de comando:
(cat; echo '$1') <<\ENV |\
env - dash -sa -- printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
PWD=/home/mikeserv/test
Apenas $PWD
é exibido.