Bash

從 bash 腳本開始的文件的“全域儲存”PID

  • November 7, 2018

我在腳本中編譯乳膠文件,然後我試圖打開一個新的 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 視窗打開,它就可以按預期工作。我想解決這個問題,使其適用於打開的任意數量的 llpp 視窗。

理想情況下,我會從 bash 腳本中修復程序的 PID,但我知道這是不可能的,因為 PID 是由核心分配的。

我以為我可以使用環境變數,但它們仍然可用於子shell,但是我可以在編譯文件、將 PID 儲存到環境變數中、關閉終端並在 LLPP 時失去環境變數的情況下執行窗戶仍然打開,但我不知道在哪裡尋找它的PID了。

我怎麼能這樣做?

簡單地說,你可以調整邏輯說:

  • 是否有使用此文件名打開的 llpp 程序?
  • 如果是這樣,HUP 它。
  • 如果沒有,請創建一個。

新程式碼:

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

問題在於對未引用$LLPP_ID變數的測試。當有兩個 PID 時,測試將擴展為語法錯誤(類似於[ 12334 24433 ])。

相反,使用-n測試來測試非空字元串(並始終引用任何變數擴展):

if [ -n "$LLPP_ID" ]; then

但這會更容易pkill

#!/bin/sh

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

這將排版您的文件,發送HUP到任何正在執行的llpp實例,無論是否有一個或多個,如果沒有,則啟動一個新實例。

請注意,我對PDF 閱讀器是什麼或做什麼一無所知。llpp

引用自:https://unix.stackexchange.com/questions/480409