Estou iniciando um terminal URxvt a partir de um script de inicialização. Quando o terminal for iniciado, gostaria de trabalhar em um diretório específico com um Python virtualenv específico carregado. Estes são os comandos que realizam isso em um terminal já em execução:
$ cd myproject
$ workon myvirtualenv
Agora, qual é o comando necessário para iniciar este terminal? Isto é o que eu tentei:
# called from startup script:
/usr/bin/urxvt -e bash -ic 'cd myproject; workon myvirtualenv'
Isso funciona, mas é quase imperceptível porque o terminal sai assim que os dois comandos são concluídos, o que é quase imediato. Posso evitar que isso aconteça chamando bash
novamente , assim:
# called from startup script:
/usr/bin/urxvt -e bash -ic 'cd myproject; workon myvirtualenv; exec bash -i'
Mas agora o virtualenv não está mais ativado na segunda instância do bash, embora o efeito do cd
comando persista.
Como posso gerar um terminal URxvt com um virtualenv ativado?
workon
é uma função (não um executável separado) por um motivo: seu trabalho é definir algo no shell atual. Não uso a ferramenta e não conheço os detalhes. É irrelevante se definir variáveis, funções, aliases, armadilhas, opções de shell ou qualquer outra coisa. O importante é quando você rodaexec bash -i
, um novobash
começa e pelo menos algumas dessas customizações não são preservadas.bash -i
Solução: faça esta corrida exataworkon myvirtualenv
por si só.A idéia é rodar
exec bash -i
em um ambiente onde a existência e o conteúdo de alguma variável de ambiente dirá ao shell para rodarworkon …
. Adicione isso ao seu~/.bashrc
:Deve ser executado depois de
workon
definido. O final do seu~/.bashrc
é provavelmente o melhor lugar.Execute
urxvt
desta forma:Notas:
O primeiro shell não precisa ser
bash
; não precisa ser interativo. Eu useish -c …
, deve ficar bom.AUTOWORKON
estará no ambiente debash
, portanto, se você executar outrobash
que leia~/.bashrc
, ele também será executadoworkon …
a partir de nossa linha no arquivo. Eu não posso dizer se você quer isso. Se não, depoisunset AUTOWORKON
de~/.bashrc
usar seu valor. Altere nossa linha para:Outra possibilidade é remover a propriedade export da variável:
export -n AUTOWORKON
.Eu escolhi arbitrariamente
AUTOWORKON
como o nome da variável. Se colidir com qualquer coisa em sua configuração atual, use outro nome.Achei outra opção. Muito obrigado a Kamil por me colocar no caminho certo! O seguinte comando gerará um novo terminal que não sai imediatamente:
Explicação:
urxvt
: Inicia o URxvt.-e bash --rcfile ...
: Ao iniciar, executebash
com o--rcfile
argumento. Isso originará o nome do arquivo a seguir , em vez do arquivo padrão.bashrc
.<(echo ...)
: sintaxe bash especial para Substituição de Processos . Isso substitui o comando dentro dos parênteses por um nome de arquivo como o/dev/fd/62
qual é um descritor de arquivo contendo a saída do comando. Você pode usar isso para dar nomes de arquivos a comandos que não permitem entrada padrão, comobash --rcfile
'. /etc/bash.bashrc; . ~/.bashrc; cd myproject; workon myvirtualenv'
: O conteúdo do rcfile gerado em tempo real. Isso contém os comandos reais que acontecem antes que o shell aceite a entrada regular do usuário.Como esse comando usa a sintaxe disponível apenas no bash, ele só pode ser executado a partir do bash shell. O seguinte comando um pouco mais complicado funciona em qualquer shell:
Isso seria mais adequado para um comando de inicialização típico, por exemplo, em
~/.xsessionrc
ou~/.xinitrc
.