web-dev-qa-db-ja.com

Bash / xdotool:コマンドは機能しますが、スクリプトでは機能しません

Linux用のbashスクリプトを作成しています。このスクリプトは、ウィンドウがフォーカスを失った場合にターミナルウィンドウを閉じます。

コマンドラインで、私はこれを行うことができました:

termwin=$(xdotool getactivewindow)

while : 
do 
  if [[ $(xdotool getactivewindow) != $termwin ]]
  then 
    exit 
  fi 
done

ターミナルに手動で入力して動作しますが、スクリプトに入れると、フォーカスが失われたときにウィンドウを閉じるのではなく、スクリプトが停止するだけです。エラーなどはありません。プロンプトに戻るだけです。

基本的なものが足りない気がします。

[〜#〜]編集[〜#〜]

これを読んだ後...: ここを参照

これを「./test.sh」ではなく「.test.sh」として実行してみましたが、機能しました。リンクは、これらのメソッドの違いを、それぞれサブプロセスまたはメインプロセスの一部としてスクリプトを実行することとして説明しています。誰かがこれを説明したり、スクリプトを変更して「。」ではなく「./」で正常に実行できるようにすることはできますか?後者では問題が発生しますか?

2
Fruckubus Crunt

.を使用してファイルを入手すると、コマンドラインで入力した場合と同じようにコマンドが実行されます。したがって、exitは現在実行中のシェルを終了します。

フォーク時にスクリプトが実行されたシェルを終了するには、親プロセスのプロセスIDを取得する必要があります。あなたは走ってみることができます

kill ${PPID}

exitの代わりにスクリプトで親シェルを強制終了します(ヒント:最初にpidをエコーし​​て、対応するプロセスを確認して、WMなどを強制終了しないようにしてください)。

${PPID}がそれを行わない場合は、pidをパラメーターとしてスクリプトに送信することもできますが、それは呼び出される方法と場所によって異なります。


urxtvd/urxvtcを使用したとおっしゃいました。この組み合わせで、このスクリプトは起動元の端末を強制終了します。

#!/bin/sh
echo kill in 3
sleep 3
kill -1 ${PPID}

したがって、この方法でkill -1を使用して、単一のurxvtcインスタンスを強制終了できるはずです。

これをソーシングで実行すると、現在実行中のターミナルのurxvtdインスタンスは$PPIDになり、allターミナルは停止することに注意してください。あなたはそれを望まない。

1

スクリプトが必要に応じて機能することを願っています。

#!/bin/sh

termwin=$(xdotool getactivewindow)
while : ; do
    [ $(xdotool getwindowfocus) = $termwin ] || kill -9 $PPID
done
0
Rony