Запустите vsim из dmenu — он работает только при прямом вызове в терминале.

Вопрос или проблема

  • Работает: vsim, sh -c vsim
  • Не работает: echo "vsim" | sh, echo "vsim" | xargs -I {} sh -c "{}"

Я хочу запустить ModelSim (vsim) с помощью dmenu, который вызывается с использованием xbindkeys.


Детали

vsim – это исполняемый файл ModelSim, установленный в /opt/altera/modelsim_ase/bin.

Когда я запускаю его напрямую, он работает. Но когда я запускаю его с помощью xargs (например, из dmenu), он вовсе не работает – сам скрипт запускается, но, вероятно, в неправильной директории или что-то еще, я действительно не понимаю, в чем проблема.

Мой путь (я добавил переносы строк для наглядности):

[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

Где vsim?

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

Запустите его с помощью xargs:

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

# 10.1d

# 
# <EOF> 
^C

Запустите его напрямую:

[ondra@x201 ~]$ vsim
Чтение /opt/altera/modelsim_ase/tcl/vsim/pref.tcl 
# --- и modelsim теперь запускается нормально ---

Буду рад любым идеям.

Из ваших экспериментов видно, что программа vsim хочет, чтобы ее стандартный ввод был подключен к терминалу; если это не так, она либо ничего полезного не делает (поскольку ожидает входные данные, но не получает их), либо выходит.

$ vsim
$ sh -c vsim

Это запускает команду обычно из терминала, в переднем плане. Команда может читать ввод из терминала.

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

В обеих случаях стандартный ввод vsim подключен к каналу из команды echo. Команда vsim будет видеть канал как ввод, а не терминал, если ей это важно. И она увидит конец файла.

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

Здесь стандартный ввод vsim подключен к каналу, но процесс выполняется в фоновом режиме, поэтому он вовсе не может читать с терминала (если он попытается это сделать, он будет приостановлен, пока не будет переведен в передний план).

Если вы хотите запустить vsim внутри пайплайна, где его стандартный ввод не будет подключен к терминалу, перенаправьте ввод из терминала к нему.

echo "vsim </dev/tty" | sh

Если вы хотите запустить программу из dmenu, вы, вероятно, должны будете открыть ее в новом эмуляторе терминала. Вызывайте xterm -e vsim вместо vsim.

Я не знаком с vsim; вполне возможно, что есть и другие способы его запуска.

Ответ или решение

Запуск vsim из dmenu: Проблемы и Решения

Запуск утилиты ModelSim (vsim) через dmenu, как вы заметили, может оказаться проблематичным из-за особенностей работы стандартного ввода и терминального окружения. Давайте более подробно рассмотрим эту проблему и предложим возможные решения.

1. Взаимодействие vsim с терминалом

Утилита vsim требует активного терминального ввода, чтобы работать корректно. В вашем случае, когда вы запускаете vsim напрямую из терминала, он получает доступ к стандартному вводу, который подключен к терминалу. Однако при выполнении команд через пайпы или в фоновом режиме, стандартный ввод не подключен к терминалу, что приводит к тому, что vsim не может выполнять свою работу.

Примеры, когда vsim работает и не работает:

  • Работает:

    $ vsim
  • Работает через оболочку:

    $ sh -c vsim
  • Не работает через пайп:

    $ echo "vsim" | sh
  • Не работает через xargs:

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

2. Понимание проблемы

Когда вы выполняете echo "vsim" | xargs -I {} sh -c '{}' &, команда vsim пытается использовать стандартный ввод, который в этом случае не является терминалом, а представляет собой замороженный поток.

3. Решения

Способ 1: Открытие vsim в новом терминале

Чтобы обойти ограничения, вы можете запустить vsim в новом терминале. Это обеспечит vsim доступ к терминальному вводу. Для этого используйте такую команду:

xterm -e /opt/altera/modelsim_ase/bin/vsim

Эта команда откроет новый терминал (в данном случае xterm) и выполнит в нем vsim, позволяя утилите получить доступ к функциям терминала.

Способ 2: Прямое вызов из dmenu

Если вы используете dmenu, настройте команду так, чтобы она запускала новое окно терминала с vsim:

  1. Убедитесь, что у вас установлен терминал (например, xterm, gnome-terminal, tilix и т. д.).
  2. Измените команду для dmenu на:
dmenu_run -i -p "Запуск ModelSim:" <<EOF
xterm -e /opt/altera/modelsim_ase/bin/vsim
EOF

Или, если вы используете xdotool и xbindkeys, вам могло бы помочь следующее:

xdotool key ctrl+alt+t

Это откроет новый терминал, после чего вы сможете вручную запустить ModelSim.

Заключение

Правильный запуск vsim через dmenu зависит от возможности сохранить подключение к терминальному вводу. Для достижения этого, лучше открыть экземпляр терминала, в котором будет запущена команда vsim. Это позволит избежать проблем с некорректным вводом и запустит ModelSim в его нормальном окружении.

Если у вас будут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...