![실행 후 bash 스크립트가 종료되지 않는 이유는 무엇입니까?](https://linux55.com/image/44421/%EC%8B%A4%ED%96%89%20%ED%9B%84%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EC%A2%85%EB%A3%8C%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
실행 중인 애플리케이션에 집중하거나 실행 중이 아니면 시작하기 위해 짧은 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 firefox
Firefox를 닫은 후에만 종료되는 이라는 지속적인 새 프로세스가 생성됩니다.
내가 뭘 잘못했나요?
편집하다:
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
잘못된 것처럼 보입니다.