실행 후 bash 스크립트가 종료되지 않는 이유는 무엇입니까?

실행 후 bash 스크립트가 종료되지 않는 이유는 무엇입니까?

실행 중인 애플리케이션에 집중하거나 실행 중이 아니면 시작하기 위해 짧은 bash 한 줄짜리 코드를 컴파일했습니다.

#!/bin/bash
#intellilaunch.sh

wmctrl -a $1 || $1 & disown
exit 1

명령줄에서 직접 실행하면 명령이 완전히 종료됩니다.

:~$ wmctrl -a firefox || firefox & disown
[1] 32505

시스템 모니터를 빠르게 확인해 보면 Firefox만 실행 중임을 알 수 있습니다.

그러나 ./intellilaunch.sh firefox스크립트()를 통해 Firefox를 시작 하면 intellilaunch.sh firefoxFirefox를 닫은 후에만 종료되는 이라는 지속적인 새 프로세스가 생성됩니다.

내가 뭘 잘못했나요?

편집하다:

michas의 제안에 따라 스크립트를 수정했습니다.

#!/bin/bash

program=$(basename $1)

if ! wmctrl -a "$program"; then
  "$1"&
fi

더 이상 한 줄의 텍스트도 없지만 이제는 정말 잘 작동합니다!

답변1

내 시스템에서 이 동작을 재현할 수 없습니다. 귀하의 설명에 따르면 백그라운드로 제대로 설정되지 않은 프로세스가 있는 것 같습니다.

다음으로 실행해 보세요 bash -x intellilaunch.sh xclock. 그러면 무슨 일이 일어나고 있는지 알 수 있습니다.

또한 ||바인딩보다 강력 &하므로 전체 파이프라인을 백그라운드로 보냅니다. 아마도 명시적인 것이 if좋은 생각 일 것입니다.

당신의

wmctrl -a firefox || firefox & disown ; exit 1

로 설명되었다

( wmctrl -a firefox || firefox ) & disown ; exit 1

그리고 당신은 아마 의미

wmctrl -a firefox || ( firefox & disown ) ; exit 1 

따라서 bash는 wmctl 및 firefox를 사용하는 작업과 disown 및 종료를 사용하는 작업 등 두 가지 작업을 시작합니다. 백그라운드 작업은 시작하는 데 시간이 짧기 때문에 명령이 약간 늦게 시작될 수 있으며 이로 인해 출력 순서가 bash -x잘못된 것처럼 보입니다.

관련 정보