Вопрос или проблема
- Работает:
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
:
- Убедитесь, что у вас установлен терминал (например,
xterm
,gnome-terminal
,tilix
и т. д.). - Измените команду для 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 в его нормальном окружении.
Если у вас будут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться!