- 働く:
vsim
,sh -c vsim
- 働かない:
echo "vsim" | sh
、echo "vsim" | xargs -I {} sh -c "{}"
vsim
ModelSim() を実行したいと思います。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に慣れていません。おそらくそれを実行する別の方法があります。