私は私のWMで非常に単純な貧しい人々の「実行ボックス」/プログラムランチャーを作成しようとしています。
私のメニューには次のものがあります。
"Run" f.exec "xterm -fg black -bg white -geometry 25x1 -T Run -e 'read input && exec $input' &"
これはユーザー入力を可能にするクールな小さな実行ダイアログを生成しますが、サブルーチンの実行中は実行され続けます。子プロセスは、すぐに終了する必要があるときに開始されます。
最初はこれは単純なアイデアのように見えましたが、今はfuが提供するスクリプトよりはるかに難しいようです。どのようなヒントがありますか?
編集:他の人が同様のことをしようとした場合に備えて、戻ってきて私がしたことを投稿すると思いました。
.twmrcのTWMメニューセクション
"Command" !"xterm -fg dimgrey -bg white -geometry 25x1+840+1150 -name run -title Run -e ~/scripts/getrun &"
そしてgetrunの内容は
read -p "# " userinput
nohup $userinput >/dev/null 2>&1 &
PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
答え1
&
質問の説明を見ると、コマンドラインの終わりが望むものではないようです。この場合、xtermをバックグラウンドに置いてスクリプトを実行し続けますが、xtermの後に実行するものはありません。&
実行コンマ内に閉じる引用符を入れることもできます。ただし、xtermの動作とパラメータ、TWMの動作方法がわからないため、動作するとは保証できません。うまくいかない場合は、標準シェルでこれを行う方法の例を示します。これは、別のスクリプトを介して使用しているコンテキストに合わせて再現できます。
これをテストして実装する方法の例として、/tmp/
ディレクトリに2つのスクリプトを作成しました。最初の項目にはrunbg.sh
期待される機能が含まれています。
#!/bin/sh
read cmdline
$cmdline &
/tmp/infiniteloop.sh
期待どおりに動作するかどうかをテストする2番目のスクリプトは、各反復ごとに現在の日付をファイルに追加するスリープタイマーを含む無限ループです/tmp/infiniteloop.tmp
。
#!/bin/sh
while true; do
date >> /tmp/infiniteloop.tmp
sleep 30
done
その後、/tmp/runbg.sh
コマンドを実行して入力すると/tmp/infiniteloop.sh
シェルに戻ります。infiniteloop.sh
スクリプトがまだ実行中であることを確認できますtail -f /tmp/infiniteloop.tmp
。すべての操作が正しく行われた場合は、30秒ごとに現在の日付を含む新しい行が表示されます。
したがって、あなたの場合は、別のシェルスクリプトを作成してコマンドを読み取り、バックグラウンドで実行してから、TWMメニュー設定ファイルからそのスクリプトを呼び出すことをお勧めします。