두 번째 인스턴스를 열지 않으려면 어떻게 해야 합니까?

두 번째 인스턴스를 열지 않으려면 어떻게 해야 합니까?

lirc리모컨으로 PC를 제어할 수 있도록 설정했습니다 . 내가 편집한 다른 모드 사이를 전환하려면.lircrc다음과 같이:

begin vlc
    include ~/.lirc/vlc
end vlc
begin gnome
    include ~/.lirc/gnome
end gnome
begin firefox
    include ~/.lirc/firefox
end firefox
begin me-tv
    include ~/.lirc/me-tv
end me-tv

begin
    prog = irexec
    button = KEY_YELLOW
    config = if [ -n $(pgrep -f vlc) ]; then (vlc &); fi
    mode = vlc
end
begin
    prog = irexec
    button = KEY_GREEN
    mode = gnome
end
begin
    prog = irexec
    button = KEY_RED
    config = if [ -n $(pgrep -x firefox) ]; then (firefox &); fi
    mode = firefox
end
begin
    prog = irexec
    button = KEY_BLUE
    config = if [ -n $(pgrep -x me-tv) ]; then (me-tv &); fi
    mode = me-tv
end

Firefox로 전환하는 것을 제외하면 모든 것이 잘 작동합니다. Firefox가 실행 중일 때 빨간색 버튼을 누르면 모드가 전환됩니다(원하는 대로).그리고 Firefox의 두 번째 창/인스턴스를 엽니다(그렇지 않아야 함)..

문제는 Firefox에서만 나타납니다.

EditPreferencesTabs→가 Open new windows in a new tab instead이미 활성화되어 있습니다:

탭 환경설정

무슨 일이야Firefox가 실행 중일 때firefox터미널에서 시작하나요 ?

  • firefox- 두 번째 창이 열립니다
  • firefox about:startpage- 사전 구성된 시작 페이지와 함께 Firefox의 새 탭이 열립니다.
  • (!) firefox about:blank- Firefox의 새 탭이 개인 시작 페이지와 함께 열립니다(단축 다이얼)
  • firefox chrome://speeddial/content/speeddial.xul (단축다이얼 시작페이지 주소)- 아무 반응이 없습니다

무슨 일이야Firefox가 실행되지 않을 때firefox터미널에서 시작하나요 ?

  • firefoxPreferences- Firefox는 ( Show my windows and tabs from last time) 에 구성된 대로 열립니다 .
  • firefox about:startpage- Firefox는 사전 구성된 시작 페이지가 있는 추가 새 탭으로 열립니다.
  • (!) firefox about:blank- Firefox는 새로운 빈 탭이 추가로 열립니다.
  • firefox chrome://speeddial/content/speeddial.xul- Firefox가 열리지 않습니다:
    *** Preventing external load of chrome: URI into browser window.
    Use -chrome <uri> instead

그래서 스크립트( config = ...)의 명령어를 수정하고 주소를 추가 하면 about:blank부분적으로 문제가 해결되는 것 같습니다. 문제가 남아 있기 때문에Firefox를 포그라운드에 두지 않습니다이미 실행 중일 때. 이런 일만 일어납니다때때로.

이 잘못된 동작을 수정하기 위해 이 스크립트를 편집하는 데 도움을 줄 수 있는 사람이 있습니까?(원천내가 수정한 스크립트의 내용입니다.)

답변1

그 중 일부 쉘 코드원천주장하는 대로 수행하지 않습니다. 주로 다음과 같은 유형이 사용됩니다.

if [ -n $(pgrep -f vlc) ]; then (vlc &); fi

이는 vlc &두 가지 경우에 실행됩니다. "vlc"와 일치하는 프로세스가 없고 "vlc"와 일치하는 프로세스가 정확히 하나인 경우. "vlc"와 일치하는 프로세스가 두 개 이상 있으면 vlc &실행되지 않습니다. 따라서 이러한 if 블록은 다소 쓸모가 없습니다. 그냥 달리는 것이 vlc &더 정확할 것입니다.

불행하게도 잘못된 쉘 조언은 인터넷에서 흔한 일입니다.

문제 설명에서 원하는 결과는 프로그램이 아직 실행 중이 아닌 경우 실행되고, 실행 중인 경우 해당 창을 앞으로 가져오고 초점을 맞추는 것입니다. 이를 위해 wmctrl사용될 수 있습니다.

wmctrl -a 'Mozilla Firefox'제목에 "Mozilla Firefox"가 포함된 창을 찾아 "활성화"합니다. 즉, 그것이 있는 작업 공간으로 이동하여 앞으로 가져오고 집중하십시오. 둘째, 일치하는 창이 없으면 wmctrl은 아무것도 하지 않고 0이 아닌(false) 종료 상태로 종료합니다. 이 경우 프로그램이 실행 중이 아니라고 가정하고 대신 시작할 수 있습니다.

wmctrl -a 'Mozilla Firefox' || firefox &

그래도 아직 완벽하지는 않습니다. Firefox 창 이외의 다른 창에는 잠재적으로 제목에 해당 문자열이 포함될 수 있으므로 이 경우 올바른 창을 식별하는 보다 안정적인 방법을 찾아야 합니다.

-x를 사용하면 wmctrl은 일반적으로 프로그램별로 고유한 값을 갖는 창의 VM_CLASS에서 작동합니다. wmctrl -lxFirefox가 실행되는 동안 실행하면 볼 수 있듯이 모든 Firefox 창에는 VM_CLASS "Navigator.Firefox"가 있습니다.

$ wmctrl -lx
...
0x03ba3d43  3 gnome-terminal.Gnome-terminal  pilot Terminal
0x04c000bc  0 Navigator.Firefox     pilot Group #1 - Speed Dial - Mozilla Firefox

이를 통해 VM_CLASS로 정확히 "Navigator.Firefox"가 있는 창을 선택할 수 있습니다.

wmctrl -Fxa Navigator.Firefox || firefox &

다른 프로그램에도 동일하게 적용될 수 있기를 바랍니다.

관련 정보