Como eu crio um lançador de aplicações gráficas para o xfce4-terminal com peixes, mas herdam as variáveis de ambiente do bash?

4

Se eu executar fish de um prompt bash , ele herdará as variáveis de ambiente que eu defini em meus arquivos .bashrc e .profile , incluindo a variável $PATH importante. Até aí tudo bem.

Agora, quero que o xfce4-terminal , meu emulador de terminal, use fish em vez de bash. Descobri que ele suporta um parâmetro de linha de comando -e para isso, mas se eu executar xfce4-terminal -e fish de um ativador de aplicativo da GUI 1 , não obtenho as variáveis de ambiente do bash. O que dá?

1 O lançamento do xfce4-terminal a partir de um prompt bash interativo também não funcionou, mas o gnome-terminal, que possui um comutador de linha de comando semelhante, também funcionou. No entanto, o gnome-terminal também não obteve as variáveis quando iniciado a partir de um atalho da GUI.

Edit: Eu já mordi a bala e acabei de fazer fish no meu shell de login com chsh --shell /usr/bin/fish . É muito mais simples do que eu estava tentando fazer antes e evita alguns efeitos indesejáveis da execução de peixes dentro do bash (como ter a variável de ambiente $SHELL definida como bash)

    
por hugomg 14.01.2014 / 22:02

4 respostas

6

Quando o bash é executado como um shell não interativo, ele não origina o arquivo .bashrc e, se você usar um gerenciador de exibição gráfico, o shell de login usado para executar os comandos do ativador GUI não pode ter adquirido o arquivo .profile . Assim, os comandos executados usando o ativador da GUI podem não ter as variáveis de ambiente desejadas definidas durante a execução.

Uma solução que encontrei foi dizer ao emulador de terminal para executar o bash no modo interativo (com o sinalizador -i) e, em seguida, executar imediatamente o peixe dentro dele:

xfce4-terminal -e 'bash -i -c fish'
    
por 14.01.2014 / 22:02
2

O que acontece quando você inicia a partir do painel da GUI é que os processos-filhos obtêm o ambiente a partir dele, e isso normalmente não origina seus scripts interativos bash. Portanto, as variáveis exportadas não estão presentes nos programas lançados da GUI.

O que você pode fazer é alterar o script de inicialização da GUI para criar um novo arquivo que defina essas variáveis.

O que eu faço é colocar todas as variáveis exportadas em um arquivo separado que é originado do ~ / .bash_profile, ou ~ / .zlogin (para zsh), que eu chamo de ~/.environ .

Entradas de exemplo neste arquivo:

PATH=${PATH}:$HOME/bin:$HOME/.local/bin:/usr/games/bin
export SSH_ASKPASS=/usr/bin/x11-ssh-askpass

Para a GUI, agora você precisa modificar esse script de inicialização.

O Xfce irá preferir o seu xinitrc pessoal, então primeiro faça isso:

cp /etc/xdg/xfce4/xinitrc ~/.config/xfce4/xinitrc

Em seguida, edite esta cópia e adicione esta linha:

source $HOME/.environ

Eu adiciono isso antes da linha inicial do xfce4-session. Agora o iniciador da GUI terá as mesmas variáveis exportadas que qualquer shell. Qualquer coisa que tenha sido lançada a partir dele irá herdá-los, como se fossem lançados de uma sessão de shell.

    
por 15.01.2014 / 01:08
1

Excluir arquivos de configuração de leitura

Acredito que você também poderia fazer isso usando apenas /bin/sh ou mesmo bash sem que nenhum arquivo de configuração fosse lido.

Exemplos

$ xfce4-terminal -e '/bin/sh -c fish'
$ xfce4-terminal -e 'bash -norc -c fish'

Incluir arquivos de configuração de leitura

Se você tiver o objetivo de fazer com que o Bash leia essas variáveis e, em seguida, lançar o fish , você poderá alterar um pouco a mudança.

$ xfce4-terminal -e '/bin/sh -i -c fish'

Ou use a técnica que você mencionou na sua resposta .

$ xfce4-terminal -e 'bash -i -c fish'

Dica de depuração

Você também pode depurar o que está acontecendo usando strace para ver quais arquivos estão sendo lidos quando invocar seus shells dentro do terminal do xfce4.

$ xfce4-terminal -e 'strace -o strace.log /bin/sh -c fish'

Se você passar pelo arquivo strace.log resultante, não verá nenhuma menção aos arquivos de configuração que está tentando evitar ler.

    
por 14.01.2014 / 22:48
0

Solução

...
Exec=bash -i -c "/home/mozes/dev/sqldeveloper/sqldeveloper.sh"
...

Explicação

" -i If the -i option is present, the shell is interactive."

Exemplo Lançador XFCE usando variáveis de ambiente de

~/.bashrc

para fornecer informações para o SQLDeveloper, de modo que ele possa encontrar os aliases do TNS Listener em tnsnames.ora

ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1; export ORACLE_HOME

Iniciador do XFCE:

[Desktop Entry]
Version=1.0
Type=Application
Name=Oracle SQLDeveloper
Comment=
Exec=bash -i -c "/home/mozes/dev/sqldeveloper/sqldeveloper.sh"
Icon=/home/mozes/dev/sqldeveloper/icon.png
Path=
Terminal=false
StartupNotify=false
    
por 15.05.2016 / 13:46