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.