Bashスクリプトから始まるファイルの「Global Storage」PID

Bashスクリプトから始まるファイルの「Global Storage」PID

スクリプトでラテックスファイルをコンパイルし、新しいPDFリーダーウィンドウを開くか、現在のウィンドウを再ロードしようとします(llppは私のリーダーです)。スクリプトをコンパイルした後

pdflatex $FILE_NAME
LLPP_ID=$(pgrep llpp)
if [ $LLPP_ID ]
then
kill -HUP $LLPP_ID
else
llpp $FILE_PATH"/"$FILE_NAME".pdf" &
fi

llppウィンドウが1つだけ開いている場合は、期待どおりに機能します。私はこの問題を修正してllpp開いているウィンドウの数に関係なく動作したいと思います。

理想的には、bashスクリプトでプロセスのPIDを変更しますが、PIDはカーネルによって割り当てられているため不可能であることがわかります。

私は環境変数を使用でき、サブシェルで引き続き使用できると思いましたが、ファイルをコンパイルせずにウィンドウを実行でき、PIDを環境変数に保存し、LLPPがまだ開いているときに端末を閉じて環境変数を失うことができました。しかし、もはやPIDをどこで見つけることができるのかわかりません。

どうすればいいですか?

答え1

簡単に言えば、ロジックを調整できます。

  • このファイル名で開いているllppプロセスはありますか?
  • その場合はHUPしてください。
  • ない場合は新規作成します。

新しいコード:

pdflatex "$FILE_NAME"
if ! pkill -HUP -f "llpp ${FILE_PATH}/${FILE_NAME}.pdf"; then
  llpp "${FILE_PATH}/${FILE_NAME}.pdf" &
fi

答え2

問題は、引用されていない変数のテストにあります$LLPP_ID。 2つのPIDがある場合、テストは構文エラーに展開されます(に似ています[ 12334 24433 ])。

代わりに-ntestを使用して空でない文字列をテストします(そして常に変数拡張を引用してください)。

if [ -n "$LLPP_ID" ]; then

ただし、以下を使用する方が簡単ですpkill

#!/bin/sh

pdflatex "$filename"
if ! pkill -HUP llpp; then
    llpp "$filepath/$filename.pdf" &
fi

これにより、文書がフォーマットされ、HUP実行中のllppインスタンスが1つ以上あるかどうかに関係なくその文書が送信され、インスタンスがない場合は新しいインスタンスが起動されます。

知っておいてください何もないllppPDFリーダーが何であるか、何をしているかについて。

関連情報