실행 중인 애플리케이션에 집중하거나 실행 중이 아니면 시작하기 위해 짧은 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
잘못된 것처럼 보입니다.