이 Fish 스크립트가 실행기에서 실행되지 않는 이유는 무엇입니까?

이 Fish 스크립트가 실행기에서 실행되지 않는 이유는 무엇입니까?

나는 데몬을 시작하고 Zenity 창을 표시한 다음 창이 닫힐 때 데몬을 중지하도록 설계된 다음 스크립트를 작성했습니다.

#!/usr/bin/fish

if not ps aux | grep [s]erviio > /dev/null
    set -x JAVA "/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java"

    ~/Programs/serviio/bin/serviio.sh &

    zenity --info --text="Serviio is running.\nClick OK to stop." --title="Serviio"

    ~/Programs/serviio/bin/serviio.sh -stop
end

터미널에서 스크립트를 실행하면 제대로 작동합니다.또한 bash 터미널에서도 실행되는데, 이는 Shebang이 예상대로 작동하고 있음을 나타내는 것으로 보입니다.

그러나 스크립트를 가리키도록 실행 프로그램을 만들고 실행하려고 하면 아무 일도 일어나지 않습니다. Serviio가 시작되지 않으며(확인할 수 있음 ps aux) Zenity 창이 나타나지도 않습니다.

스크립트에 문제를 일으키는 원인이 무엇인지 알아내려고 노력했지만 성공하지 못했습니다.

  • Serviio가 실행 중인지 테스트를 제거하면 스크립트가 작동합니다.
  • 확인을 유지했지만 스크립트가 Serviio를 시작하는 대신 Zenity 창에 $JAVA의 내용을 표시하도록 하면 작동합니다.

즉, 스크립트 실행을 방해하는 요소를 스크립트에서 식별할 수 없습니다.

무엇이 문제일까요?

답변1

명령 출력을 파일로 리디렉션하여 ps원인을 찾았습니다 . 런처에서 스크립트를 실행하면 grep은 스크립트 자체(이름에 "serviio" 포함)를 찾으므로 "if" 내부의 코드를 실행하지 않습니다.

grep이 더 구체적으로 찾고 있는 것을 만들어서 문제를 해결했습니다.

주된 이유는 스크립트를 터미널에서 직접 실행하면 프로세스로 나타나지 않지만, 런처에서 실행하면 스크립트를 인수로 인터프리터(이 경우 피쉬)가 나타나기 때문인 것 같습니다. .

관련 정보