xclip - command line interface to X selections (clipboard)

여기서는 xclip을 통해 클립보드에 데이터를 넣고 뺴는 것을 편리하게 사용해 보자.

X Selections

리눅스 X11에는 우리가 흔히 클립보드라고 부르는 것을 Selection이라 하며 이것에 대해 세 가지 타입을 제공한다. 각각 primary, secondary, 그리고 일반적으로 사용하는 clipboard가 되겠다. 이름이 Selection이므로 당연하게도 뭔가를 선택하게 되면 이 부분은 자동으로 채워지게 된다. Ctrl+C, Ctrl+V의 경우 primary가 아니라 clipboard를 사용한다.

  • Primary: 무언가를 선택하는 것만으로 내용이 채워진다. 암시적으로 동작하며 따라서 유저의 의도대로 채워지는 것이 아니다. X11에서는 마우스 중간 버튼으로 불러낼 수 있다.
  • Clipboard: 명시적으로 복사/붙여넣기 명령을 통해 값을 빼고 넣을 수 있다.

일반적으로 우리가 사용하는 것은 X11에서는 클립보드이며, Primary는 잘 사용하지 않는 것 같다. 윈도우에서는 Putty나 그런 것을 잠깐 쓸 때 Primary느낌으로 사용하긴 한 것 같다. 생각해 보니… 리눅스에서 지원하는 Primary에 맞추어 동작하려니 클립보드에 값이 들어가는건가?

따라서 X11 어플리케이션을 구현하는 입장에서는 이런 클립보드 정책을 고민하면서 개발해야 할 것 같은데, 여기서는 이 이야기는 이정도로만 하고 xclip을 실제로 사용해 보자.

설치

우분투 기준

$ sudo apt-get install xclip

xclip 패키지를 설치하면 된다.

실행

$ xclip -h
Usage: xclip [OPTION] [FILE]...
Access an X server selection for reading or writing.

  -i, -in          read text into X selection from standard input or files (default)
  -o, -out         prints the selection to standard out (generally for piping to a file or program)
  -l, -loops       number of selection requests to wait for before exiting
  -d, -display     X display to connect to (eg localhost:0")
  -h, -help        usage information
      -selection   selection to access ("primary", "secondary", "clipboard" or "buffer-cut")
      -noutf8      don't treat text as utf-8, use old unicode
      -target      use the given target atom
      -rmlastnl    remove the last newline character if present
      -version     version information
      -silent      errors only, run in background (default)
      -quiet       run in foreground, show what's happening
      -verbose     running commentary

Report bugs to <astrand@lysator.liu.se>

-i를 통해 클립보드에 값을 넣을 수 있고, -o를 통해 클립보드에서 값을 꺼낼 수 있다. -selection 파라미터를 통해 위에서 확인한 클립보드 타입 Primary, Clipboard를 지정할 수 있다.

사용

$ cat xcliptest.json
{
    "xclip": "very simple cli"
}
$ cat xcliptest.json | xclip -i -selection primary
$ xclip -o -selection primary
{
    "xclip": "very simple cli"
}

다음과 같이 primary에 값을 넣고 뺄 수 있다. 참고로 primary에 들어갔으니까 X11에서 마우스 가운데 버튼을 누르는 것으로 붙여넣기 할 수도 있다. 그리고 당연히 Ctrl+V로 값을 꺼낼 수 없다.

$ cat xcliptest.json | xclip -i -selection clipboard
$ xclip -o -selection primary
 % 
$ xclip -o -selection clipboard
{
    "xclip": "very simple cli"
}

이번에는 clipboard에 값을 넣었다. 마찬가지로 primary에서는 값이 나오지 않지만 clipboard에서는 값을 꺼낼 수 있다. 따라서 마우스 가운데 버튼으로는 값을 꺼낼 수 없고 Ctrl+V로 값을 꺼내야 한다.

활용

터미널상에서 뭔가를 출력한 후에 어딘가에 옮기려고 복사-붙여넣기를 하다가 보니 너무 불편해서 /dev밑에 클립보드 장치같은게 있나 하다 알게 되었는데, cygwin에서는 /dev/clipboard를 제공하는데 리눅스에서는 이걸 제공하지는 않는 것 같다.

아무튼 그래서 cat의 출력을 바로 클립보드에 넣는다거나 클립보드 데이터에 억세스해야하는 간단한 쉘 프로그램에서도 이걸 유용하게 쓸 수 있을 것 같다. Secondary는 어디에서도 명시적으로 쓰이는 곳이 없으므로 쉘 같은곳에서는 Secondary를 사용해서 작성하는 것이 조금 도움이 될 것 같다.

그런데 인터넷 검색을 꽤 해도 Secondary 클립보드에 대한 유래 설명이 잘 안나오는 것 같다. 이렇게 쓰는게 맞는건지..