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.