コマンドを実行してすぐにターミナルを終了するにはどうすればいいでしょうか?

コマンドを実行してすぐにターミナルを終了するにはどうすればいいでしょうか?

私が何をしようとしているのかは明らかでしょう:

オリジナルscript.sh:

select blah in foo bar oof rab
do
  cmd $blah
  break
done

かなり基本的なことです。次のことを試したときに問題が発生します。

> xterm -e 'script.sh'

script.sh は、シェルから呼び出されると正常に動作します。しかし、fvwm から呼び出そうとすると、" cmd $blah" の結果が表示されません。次の変更を試しても何も起こりません。

select blah in foo bar oof rab
do
  nohup cmd $blah > /dev/null 2>&1 &
  break
done

どうすれば目的の機能を実現できますか? (つまり、選択を行うのに十分な時間 xterm をポップアップ表示し、コマンドがバックグラウンドで実行されている間に xterm 自体を終了するにはどうすればよいですか?)

答え1

スクリプトの最後の行に待機PID関心のあるバックグラウンド コマンドの命令を実行すると、PIDスクリプトは終了します。 もちろん、それをPIDスクリプトに保存する必要があります。

#!/bin/bash 
# do first stuff...
select blah in foo bar oof rab
do
  cmd $blah &
  PID_TO_WAIT_FOR=$!  # here you store the PID of the last command
  break
done
# do other stuff 
wait  $PID_TO_WAIT_FOR

ノート:

  • wait はシェルの組み込みコマンドです。指定された各プロセスが完了するまで待機し、終了ステータスを返します。 これを参考にしてくださいヘルプ

答え2

新しいセッションで実行してからxterm現在のターミナルを終了すると、うまくいきますか? 新しいターミナルは引き続き動作するはずです。

xterm -e "bash -c \"./script.sh; exec bash\"" &

編集:

以下のアプローチにより、ターミナルのGUIからスクリプトを実行し、実行するコマンドを選択し、ターミナルを離れてもコマンドは引き続き機能します。例として、commandscript.shにいくつかのコマンドを入れました。

選択スクリプト:

#!/bin/bash
# Bash Menu Script Example

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice 1"
            ;;
        "Option 2")
            echo "you chose choice 2 HEXDUMP"
            nohup bash commandscript.sh 
            ;;
        "Option 3")
            echo "you chose choice 3"
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

コマンドスクリプト:

#!/bin/bash
exec hexdump /dev/urandom | grep --line-buffered -i "ffff f" > random &

関連情報