Executa vsim do dmenu - só funciona quando invocado diretamente no terminal

3
  • Works: vsim , sh -c vsim
  • Não funciona: echo "vsim" | sh , echo "vsim" | xargs -I {} sh -c "{}"

Eu quero executar ModelSim ( vsim ) com dmenu , que é acionado usando xbindkeys .

Detalhes

vsim é um executável do ModelSim, instalado em /opt/altera/modelsim_ase/bin .

Quando eu o executo diretamente, ele é executado. Mas quando eu corro com xargs (por exemplo, do dmenu), ele não funciona de forma alguma - o próprio script é iniciado, mas provavelmente no diretório errado ou algo assim, eu realmente não sei o que está errado.

Meu caminho (adicionei novas linhas para maior clareza):

[ondra@x201 ~]$ echo $PATH
/usr/local/sbin:
/usr/local/bin:
/usr/bin:
/usr/lib/jvm/default/bin:
/usr/bin/site_perl:
/usr/bin/vendor_perl:
/usr/bin/core_perl:
/opt/altera/quartus/bin:
/opt/altera/modelsim_ase/bin:
/home/ondra/bin:
/home/ondra/.gem/ruby/2.1.0/bin:
/opt/altera/University_Program/Monitor_Program/bin/bin

Onde está vsim ?

[ondra@x201 ~]$ which vsim
/opt/altera/modelsim_ase/bin/vsim

Execute com xargs :

[ondra@x201 ~]$ echo "vsim" |  xargs -I {} sh -c '{} &'
[ondra@x201 ~]$ Reading /opt/altera/modelsim_ase/tcl/vsim/pref.tcl 

# 10.1d

# 
# <EOF> 
^C

Execute diretamente:

[ondra@x201 ~]$ vsim
Reading /opt/altera/modelsim_ase/tcl/vsim/pref.tcl 
# --- and modelsim starts fine now ---

Todas as ideias são bem-vindas.

    
por MightyPork 18.11.2014 / 11:12

1 resposta

0

Nas suas experiências, parece que o programa vsim quer que sua entrada padrão seja conectada a um terminal; se não for, ele não faz nada útil (porque está aguardando entrada, mas não obtém nenhum) ou sai.

$ vsim
$ sh -c vsim

Isso executa o comando normalmente de um terminal, em primeiro plano. O comando pode ler a entrada do terminal.

$ echo "vsim" | sh
$ echo "vsim" | xargs -I {} sh -c "{}"

Em ambos os casos, a entrada padrão de vsim é conectada ao pipe a partir do comando echo . O comando vsim verá um pipe como sua entrada e não um terminal, se ele se importar. E vai ver o final do arquivo.

$ echo "vsim" |  xargs -I {} sh -c '{} &'

Aqui, não apenas a entrada de vsim está conectada ao pipe, mas o processo é executado em segundo plano, então ele não pode ler o terminal (se tentar, ele será suspenso até que seja colocado em primeiro plano).

Se você deseja executar vsim dentro de um pipeline onde sua entrada padrão não seria conectada ao terminal, redirecione a entrada do terminal para ela.

echo "vsim </dev/tty" | sh

Se você quiser executar o programa a partir do dmenu, presumivelmente terá que abri-lo em um novo emulador de terminal. Invoque xterm -e vsim em vez de vsim .

Eu não estou familiarizado com o vsim; É bem possível que existam outras maneiras de executá-lo.

    
por 20.11.2014 / 03:37