- 作品:
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不熟悉;很可能还有其他方式来运行它。