dmenuでvsimを実行 - 端末から直接呼び出す場合にのみ機能します。

dmenuでvsimを実行 - 端末から直接呼び出す場合にのみ機能します。
  • 働く: vsim,sh -c vsim
  • 働かない: echo "vsim" | shecho "vsim" | xargs -I {} sh -c "{}"

vsimModelSim() を実行したいと思います。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に慣れていません。おそらくそれを実行する別の方法があります。

おすすめ記事