Bash
從 bash 腳本開始的文件的“全域儲存”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 視窗打開,它就可以按預期工作。我想解決這個問題,使其適用於打開的任意數量的 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