从 dmenu 运行 vsim — 仅在终端中直接调用时才有效

从 dmenu 运行 vsim — 仅在终端中直接调用时才有效
  • 作品: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 ~]$ Reading /opt/altera/modelsim_ase/tcl/vsim/pref.tcl 

# 10.1d

# 
# <EOF> 
^C

直接运行:

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

欢迎任何想法。

答案1

从您的实验来看,程序似乎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不熟悉;很可能还有其他方式来运行它。

相关内容