Como executo um programa em uma nova shell?

2

Eu tenho um programa que faz muita manipulação de env. Ele define PYTHONPATH e LD_LIBRARY_PATH e coisas assim.

Este programa precisa executar OUTRO programa, mas em um env novo, sem toda a manipulação de env, mas com o env base de arquivos rc.

Eu pensei que seria capaz de fazer isso com csh -c, mas isso mantém o env atual. Existe uma boa maneira de fazer isso?

Realmente não importa qual shell eu uso para isso. Note também que eu preciso dos arquivos .rc originais, então env -i não funciona muito bem para mim. (Eu suponho que eu poderia hackear algo junto com env e bash -cl, mas deveria haver um método melhor)

    
por Brian Postow 11.11.2013 / 18:09

5 respostas

2

Bifurcação de um novo processo preservará o ambiente.

Se você precisar executar um processo com um determinado ambiente, todos os processos iniciados por este também usarão esse ambiente.

No entanto, você pode salvar um ambiente não poluído em um arquivo: export >original_env .

Mais tarde, você pode limpar o ambiente poluído usando env -i e importar o ambiente antigo fazendo o sourcing desse arquivo.

    
por 11.11.2013 / 22:47
1

Não tenho certeza se isso é ideal, mas consegui o seguinte para trabalhar em pequenos testes:

env -i /bin/bash -cl 'COMMAND'

Evidentemente, você não pode executar csh com -cl porque -l não pode coexistir com outros argumentos ... mas no bash você pode.

ETA:

Acho que é isso que vou usar:

#!/bin/csh -f
set evs = ""
if ($1 == '--envVars') then
    set envs = "$2"
    shift
    shift
endif

env -i $envs CMD="$*" /bin/bash -c '$CMD'

Permite-me introduzir variáveis ENV a partir da linha de comandos, se necessário, como $ PATH e $ PYTHONPATH ...

    
por 11.11.2013 / 21:20
0

A maneira mais fácil de pensar é não export de suas variáveis. Dependendo do seu cenário de uso, isso pode ou não ser viável. Por exemplo:

$ cat a.sh
#!/bin/bash
BAR=foo
export BAZ=foo
bash -c 'echo "bash -c : BAR: $BAR, BAZ: $BAZ"'
echo "normal  : BAR: $BAR, BAZ: $BAZ"

$ ./a.sh
bash -c : BAR: , BAZ: foo
normal  : BAR: foo, BAZ: foo

Como você pode ver no exemplo acima, o shell; aunched by bash -c só terá acesso às variáveis exportadas.

    
por 11.11.2013 / 18:24
0

Dependendo do que você quer,

env -i PATH="$(getconf PATH)" HOME="$HOME" USER="$USER" SHELL="$SHELL" "$SHELL" -lc "your command"

tentaria redefinir um ambiente padrão para o seu shell. Você também pode adicionar um i às opções do shell para que ele seja interativo.

Alternativamente, você pode fazer

env > saved.env
...
env -i 'cat saved.env' your command

para salvar e restaurar o ambiente. Mas você terá que processar saved.env para que ele seja corretamente citado (eu tenho alguns env vars com espaços e tabulações em seu valor).

    
por 11.11.2013 / 20:14
0

A única maneira que encontrei é usar o sudo, se você tiver permissão para fazer isso:

sudo -u "$USER" path_to_script

Exemplo de script:

#!/bin/sh
set | grep ARGH

Uso:

$ export ARGH=yes
$ sudo -u "$USER" ./check_env
(empty line, so ARGH is not set)
    
por 28.10.2016 / 16:50