Digamos que eu tenha um script que seja sempre executado a partir de um shell interativo. Eu gostaria que este script lançasse um subshell interativo que seja uma réplica do pai (ou seja, todas as variáveis de ambiente, etc. preservadas) e, em seguida, execute comandos arbitrários (especificamente, gostaria de alterar PS1
e definir alguns aliases) . Eu preciso de um subshell genuíno (ao invés de usar source
, caso contrário, as variáveis de ambiente não persistirão após o script terminar) e ele precisa ser agnóstico em shell (ou seja, funciona com bash, zsh, etc .)
A única maneira que consegui fazer isso, até agora, é lançar e fazer o script do shell com expect
. Isso é um pouco horrível, mas é meio que funciona:
expect <(cat <<-EXPECT
spawn $SHELL
send "export FOO=\"$foo\"\r"
send "PS1=\"(foo:$FOO) \\$PS1\"\r"
send "alias foo=\"do_somthing --foo=$FOO\"\r"
send "clear\r"
interact
EXPECT)
Existe uma maneira melhor? (Eu também noto que esta abordagem parece introduzir um problema com o redesenho da tela e a codificação de caracteres.)
O problema de fazer algo como PS1="$foo" $SHELL
é que PS1
pode ser substituído pelos arquivos globais e de usuário .rc do shell. Não parece haver uma maneira agnóstica de fornecer um arquivo .rc personalizado.