![コマンドを実行してすぐにターミナルを終了するにはどうすればいいでしょうか?](https://rvso.com/image/1413931/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%99%E3%81%90%E3%81%AB%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%82%92%E7%B5%82%E4%BA%86%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
私が何をしようとしているのかは明らかでしょう:
オリジナル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 &