터미널에서 현재 그놈 키보드 레이아웃을 얻는 방법?


15

bash 스크립트에서 사용하려면 사용자가 현재 사용하고있는 그놈 키보드 레이아웃을 가져와야합니다. 예를 들어 사용자가 키보드 레이아웃을로 설정하면 en-us이것을 인쇄하는 bash 명령이 필요합니다.

그 정보를 어떻게 얻을 수 있습니까?

최신 정보:

setxkbmap -query불행히도 작동하지 않습니다. 아래는 en(첫 번째 명령) 및 de(두 번째 명령) 레이아웃이 활성화 된 출력입니다. 키보드 레이아웃 전환은 그놈 세션 구성과 관련이있는 것 같습니다

setxkbmap -query 
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

setxkbmap -query
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

업데이트 2 :

setxkbmap -print #with en-us layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};
setxkbmap -print #after switching to german layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};

슬프게도 bash는 아니지만 libxklavier를 사용하여 다음과 같은 [파이썬 예제] [1]가 있습니다. [1] : cgit.freedesktop.org/libxklavier/tree/tests/test_gi.py
풍선

1
<rant> xkb는 문서화되지 않은 지옥입니다! 이러한 여러 레이아웃 정의는 안정적으로 작동하지 않습니다. 나를 위해 그들은 갑자기 임의의 시간에 전환했으며 일시 중단 후 정의 된 레이아웃 중 어떤 것이 적용되는지, 그리고 더 나쁜 것은 연결된 각 키보드에 대해 독립적으로 결정되었습니다. 예, xkb는 실제로 다른 키보드에 대해 다른 레이아웃을 가질 수 있지만 이것은 내가 아는 한 어디에도 문서화되어 있지 않으므로이 기능이 수행하는 유일한 것은 제어 할 수 없기 때문에 우리를 성가 시게합니다. xkb, 진지하게, 나를 시작하지 마십시오! </ rant>
Christian

답변:


9

Stackoverflow 에 대한 비슷한 질문에 따르면 다음과 같은 트릭이 필요합니다.

setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'

현재 X를 사용할 수있는 * nix 기계가 없기 때문에 확인할 수 없었습니다 (집에 없습니다).


1
setxkbmap -print를 실행하면 다음이 반환됩니다. 이것이 OP에 도움이되지 않는다고 생각합니다. xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us+inet(evdev)" }; xkb_geometry { include "pc(pc105)" }; };
풍선

현재 "us"레이아웃이 활성화되어 있습니까? 그것은 당신의 입력에 따라 위의 진술이 출력으로 생성하는 것입니다 (이 두 글자 : "us"). 다른 레이아웃으로 전환하면 어떻게 보입니까?
Izzy

2
답변 주셔서 감사합니다. 불행히도 이것은 트릭을 수행하지 않습니다. 두 번이나 우리를 얻습니다. 출력을 보여주기 위해 내 질문을 편집했습니다.
ftiaronsem

시도해 볼 가치가있었습니다. -v매개 변수를 여러 번 지정하여 (여러 번) 상세 정보를 제공 할 수 있습니다. -query뿐만 아니라 모두 작동합니다 -print. 다중 언어 설정이 없으므로 필요한 세부 정보를 제공하는지 여부를 알 수 없지만 -v여기서 3 번 출력하면 "적용된 규칙"과 "키맵"으로 나뉩니다. 후자는 완전한 정보 인 것처럼 보이므로 첫 번째 부분은 "현재 활성 부분"을 가질 수 있습니다.
Izzy

다시 한번 감사하지만 불행히도 이것은 해결되지 않았습니다. 레이아웃 변경 전후의 동일한 출력. 자세한 정보와 독립적으로.
ftiaronsem

4

우분투 17.10 이상

GNOME을 사용하는 Ubuntu 17.10에서는 입력 소스를 전환 할 때 현재 gsettings 값이 변경되지 않습니다. 대신가 MRU - 소스 리스트 키 m의 OST의 R을 ecently u는 입력 소스가 나오지.

$ gsettings get org.gnome.desktop.input-sources mru-sources
[('xkb', 'se'), ('xkb', 'us')]

이 목록의 첫 번째 소스는 현재 소스이므로 현재 레이아웃을 얻는 oneliner는 다음과 같습니다.

gsettings get org.gnome.desktop.input-sources mru-sources | sed -r "s/\S*\s'([^']+).*/\1/"

Ubuntu 17.10 시스템에서 Unity를 사용하는 경우이 답변이 적용되지 않습니다. Unity에서는 이전과 같이 계속 작동합니다.


3

우분투 13.04 이하

xkblayout-state도구 를 사용할 수 있습니다 . 설명, 컴파일, 설치 및 사용법 은 README.md 파일을 참조하십시오 .

다음 명령은 원하는 것을 정확하게 수행합니다.

xkblayout-state print "%s"

우분투 13.10 이상

Ubuntu 13.10은 이러한 의미에서 약간 개선되었으며 다음과 같은 간단한 bash 함수를 사용할 수 있습니다.

get_current_xkblayout () {
      current_input_nr=$(gsettings get org.gnome.desktop.input-sources current | \
          awk '{ print $NF }')
      shift=$(( 2 * ( $current_input_nr + 1 )))
      gsettings get org.gnome.desktop.input-sources sources | tr -d "\',[]()" | \
          awk -v cur="$shift" '{ print $cur }'
}

다음 명령은 13.10에서도 작동합니다.

setxkbmap -query | awk -F"(,|[ ]+)" '/layout:/ { print $2 }'

또는:

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'

2

키보드에서 Ctrl+ Alt+ T를 누르면 터미널이 열립니다. 열리면 아래 명령을 실행하십시오.

setxkbmap -query

이것은 당신이 볼 것입니다

여기에 이미지 설명을 입력하십시오


귀하의 신속한 답변에 감사드립니다, 불행히도 이것은 작동하지 않습니다. 출력은 다음과 같습니다 (처음으로 en 레이아웃으로, 두번째로 de로) :
ftiaronsem

질문 편집으로 붙여 넣은 형식으로 인해 ...
ftiaronsem

1
귀하의 프롬프트 회신에 다시 한번 감사드립니다. 이것은 내가보고있는 것에 삽입되었지만 독일이나 미국 레이아웃을 선택했는지 여부는 알려주지 않습니다. 아니면 내가 놓친 것이 있습니까?
ftiaronsem

2

터미널을 사용하여 'pt'와 'us'사이의 테스트 변경을 실행했으며 모든 변경 후에는 성공적으로 사용되는 키보드 레이아웃을 수집했습니다.

활성 키보드 레이아웃 얻기

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • 구성을 인쇄하십시오. setxkbmap -print
  • 중요한 라인을 수집하십시오. grep xkb_symbols
  • 첫 번째 "+"부호 뒤의 문자열을 가져옵니다. awk -F"+" '{print $2}'

'us'레이아웃이 활성화 된 출력은 다음과 같습니다. us


레이아웃 간 Swith

sudo setxkbmap -option grp:alt_shift_toggle pt

전환 할 언어 코드 'pt'를 읽는 위치를 전달하십시오.

여기에 이미지 설명을 입력하십시오

참고 : 우분투 12.04 (Precise Pangolin)에서 Gnome을 사용하고 있습니다.


답변 주셔서 감사합니다. 문제는 사용자가 작업 표시 줄 애플릿을 사용하여 레이아웃을 전환하는 경향이있는 것 같습니다. cmd에서 레이아웃을 전환하는 경우 작동하지만 사용자가 작업 표시 줄 애플릿으로 전환하면 작동하지 않습니다.
ftiaronsem

@ ftiaronsem, 당신은 전에 그 부분을 언급하지 않았습니다 :) 나는 그것을 조사하고 가능한 경우 내 대답을 업데이트 할 것입니다!
Zuul

0

우분투 13.10 이상

(이전 릴리스에서 작동하는지 확실하지 않음)

current_layout=gsettings get org.gnome.desktop.input-sources current | awk '{print $2}'
gsettings get org.gnome.desktop.input-sources sources | grep -Po "'[[:alpha:]]+'\)" | sed -ne "s/['|)]//g;$(($current_layout+1))p"

더 많은 옵션을 보려면 :

gsettings list-recursively org.gnome.desktop.input-sources
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.