스크립트에서 라텍스 파일을 컴파일한 다음 새 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는 커널에 의해 할당되기 때문에 불가능하다는 것을 알고 있습니다.
환경 변수를 사용할 수 있고 하위 쉘에서 계속 사용할 수 있다고 생각했지만 파일을 컴파일하지 않고 창을 실행할 수 있었고 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
. 두 개의 PID가 있는 경우 테스트는 구문 오류로 확장됩니다( 와 유사 [ 12334 24433 ]
).
대신 -n
test를 사용하여 비어 있지 않은 문자열을 테스트하세요(그리고 항상 변수 확장을 인용하세요).
if [ -n "$LLPP_ID" ]; then
그러나 다음을 사용하는 것이 더 쉬울 것입니다 pkill
.
#!/bin/sh
pdflatex "$filename"
if ! pkill -HUP llpp; then
llpp "$filepath/$filename.pdf" &
fi
이렇게 하면 문서의 형식이 지정되고 HUP
실행 중인 llpp
인스턴스가 하나 이상 있는지 여부에 관계없이 해당 문서가 전송되며, 인스턴스가 없으면 새 인스턴스가 시작됩니다.
알아두세요아무것도 없다llpp
PDF 리더가 무엇인지 또는 무엇을 하는지 에 대해 .