GNU readline
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
GNU Readline은 텍스트 편집기 Emacs 및 vi 편집 모드를 지원하는 자유 소프트웨어 라이브러리이다. 이 라이브러리는 키보드 입력을 에디터 명령으로 해석하는 방법을 결정하며, Emacs 스타일의 키 바인딩을 제공한다. Readline은 GNU 일반 공중 사용 허가서(GPL)에 따라 라이선스가 부여되며, C 언어를 포함한 다양한 프로그래밍 언어에서 사용할 수 있다. Readline에는 알려진 버그와 제한 사항이 있으며, libedit, linenoise, Haskeline, PSReadLine과 같은 대체 라이브러리도 존재한다.
더 읽어볼만한 페이지
- 텍스트 사용자 인터페이스 라이브러리 - Curses
curses는 텍스트 기반 터미널에서 사용자 인터페이스를 생성하기 위한 프로그래밍 라이브러리이며, 켄 아놀드가 BSD UNIX와 함께 개발했고, vi 편집기의 커서 이동 코드를 참고하여 만들어졌으며, termcap, terminfo, X/Open Curses를 거쳐 ncurses, PDCurses로 파생되어 유닉스 계열 운영체제에서 널리 사용된다. - 텍스트 사용자 인터페이스 라이브러리 - Ncurses
Ncurses는 System V Release 4.0 curses의 자유-오픈 소스 에뮬레이션으로, 터미널 환경에서 텍스트 기반 사용자 인터페이스를 구현하는 데 사용되며, 다양한 프로그래밍 언어 바인딩을 지원한다. - GNU 프로젝트 소프트웨어 - GNU 코어 유틸리티
GNU 코어 유틸리티는 유닉스 계열 운영체제에서 파일, 셸, 텍스트 조작을 위한 기본적인 명령어 모음으로, GNU 파일 유틸리티에서 시작하여 3개의 패키지가 통합되어 발전했으며 셸 스크립트 및 시스템 관리에 필수적인 도구를 제공한다. - GNU 프로젝트 소프트웨어 - GNU 허드
GNU 허드는 유닉스 운영 체제를 대체하는 것을 목표로 개발된 GNU 프로젝트의 커널로, 마이크로커널 기반의 서버-클라이언트 아키텍처를 사용하며, 파일 시스템 기능을 확장하는 트랜슬레이터 개념을 제공한다. - C로 작성된 자유 소프트웨어 - PostgreSQL
PostgreSQL은 캘리포니아 대학교 버클리 분교의 Ingres 프로젝트에서 시작되어 전 세계 개발자들의 협력을 통해 발전해온 객체 관계형 데이터베이스 관리 시스템(ORDBMS)이다. - C로 작성된 자유 소프트웨어 - 김프
김프(GIMP)는 GNU 프로젝트에서 개발된 크로스 플랫폼 기반의 무료 오픈소스 래스터 그래픽 편집기로, 다양한 운영체제를 지원하며 풍부한 기능을 제공하지만 사용자 인터페이스에 대한 비판과 일부 기능의 부족함에 대한 평가도 존재한다.
GNU readline - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
종류 | 라이브러리 |
저자 | 브라이언 폭스 |
개발자 | Chet Ramey |
출시일 | 1989년 |
프로그래밍 언어 | C |
라이선스 | 2009년 이후: GPL-3.0-or-later 1997년: GPL-2.0-or-later 1994년: GPL-1.0-or-later |
공식 웹사이트 | 공식 사이트 |
릴리스 정보 | |
최신 릴리스 버전 | 8.1 |
최신 릴리스 날짜 | 2020년 12월 7일 |
최신 미리보기 버전 | 8.2 |
최신 미리보기 날짜 | 2023년 6월 22일 |
2. 편집 모드
Readline은 사용자가 텍스트를 편집하는 방식을 결정하는 두 가지 주요 모드인 에맥스(Emacs) 및 vi 편집 모드를 지원한다. 이 모드들은 키보드 입력을 해석하는 에디터 명령으로 사용된다.
2. 1. Emacs 키보드 단축키
텍스트 편집기 Emacs의 키 바인딩을 사용한다.일부 시스템에서는 Alt 키 조합이 다른 단축키와 충돌할 수 있으므로, 대신 Esc 키를 사용해야 한다. 예를 들어, Xfce의 터미널 에뮬레이터 창에서 Alt+f를 누르면 커서가 한 단어 앞으로 이동하는 대신 터미널 창 메뉴에서 "파일"이 활성화된다(에뮬레이터 설정에서 비활성화하지 않은 경우).
단축키 | 설명 |
---|---|
커서 위치에서 자동 완성을 수행한다. | |
커서를 줄 시작 부분으로 이동한다(Home 키와 동일). | |
커서를 한 문자 뒤로 이동한다(왼쪽 화살표 키와 동일). | |
가상 터미널을 통해 현재 작업에 SIGINT 신호를 보내 작업을 중단하고 닫는다.[1] | |
* EOF 마커를 보내 현재 셸을 닫는다(옵션으로 비활성화하지 않는 한) (exit 명령어와 동일). (현재 줄에 텍스트가 없는 경우에만 해당) | |
(end) 커서를 줄 끝으로 이동한다(End 키와 동일). | |
커서를 한 문자 앞으로 이동한다(오른쪽 화살표 키와 동일). | |
역방향 검색을 중단하고 원래 줄을 복원한다. | |
이전 문자를 삭제한다(백스페이스와 동일). | |
탭 키와 동일하다. | |
엔터 키와 동일하다. | |
커서 뒤의 줄 내용을 지우고 클립보드에 복사한다. | |
화면 내용을 지운다(clear 명령어와 동일). | |
(next) 다음 명령을 불러온다(아래쪽 화살표 키와 동일). | |
기록에서 찾은 명령을 실행하고 편집을 위해 기록에서 현재 줄을 기준으로 다음 줄을 가져온다. | |
(previous) 이전 명령을 불러온다(위쪽 화살표 키와 동일). | |
(역방향 검색) 지정된 문자를 포함하는 마지막 명령을 불러온다. 두 번째 Ctrl+r은 검색에 해당하는 다음 이전 명령을 불러온다. | |
역방향 검색의 다음 최근 명령으로 돌아간다(터미널에서 이 명령을 실행하지 않도록 주의한다. 이 명령은 XOFF도 시작한다). XOFF 설정을 변경한 경우 Ctrl+q를 사용하여 돌아간다. | |
이전 두 문자를 바꾼다. | |
커서 앞의 줄 내용을 지우고 클립보드에 복사한다. | |
다음 입력도 제어 시퀀스인 경우 문자를 그대로 입력한다(예: Ctrl+v Ctrl+h는 "^H"를 입력한다. 리터럴 백스페이스). | |
커서 앞의 단어를 지우고 클립보드에 복사한다. | |
현재 줄을 $EDITOR 프로그램으로 편집하거나, 정의되지 않은 경우 vi로 편집한다. | |
inputrc 파일의 내용을 읽고, 거기에 있는 바인딩 또는 변수 할당을 통합한다. | |
증분 실행 취소는 각 줄에 대해 별도로 기억된다. | |
현재 Bash 인스턴스에 대한 버전 정보를 표시한다. | |
커서를 이전 위치와 번갈아 가며 표시한다. (C-x, x가 교차 모양이기 때문). | |
(yank) 커서 위치에서 클립보드 내용을 추가한다. | |
현재 작업에 SIGTSTP 신호를 보내 작업을 일시 중지한다. 백그라운드에서 실행하려면 bg 를 입력할 수 있다. 백그라운드 또는 일시 중지에서 다시 가져오려면 fg [process name or job id] (전경 프로세스)를 실행할 수 있다. | |
증분 실행 취소는 각 줄에 대해 별도로 기억된다. | |
(backward) 커서를 한 단어 뒤로 이동한다. | |
커서 아래 문자를 대문자로 바꾸고 단어 끝으로 이동한다. | |
커서 뒤의 단어를 잘라낸다. | |
(forward) 커서를 한 단어 앞으로 이동한다. | |
커서 위치부터 현재 단어 끝까지 모든 문자를 소문자로 만든다. | |
변경 사항을 취소하고 줄을 기록에 있던 대로 되돌린다. | |
커서 위치부터 현재 단어 끝까지 모든 문자를 대문자로 만든다. | |
이전 명령에 대한 마지막 인수(이전 기록 항목의 마지막 단어)를 삽입한다. |
GNU Readline은 GNU 일반 공중 사용 허가서(GPL)에 따라 라이선스가 부여된 자유 소프트웨어 라이브러리이다. GNU C 라이브러리, GNU gettext, FLTK와 같이 GNU 약소 일반 공중 사용 허가서(LGPL)에 따라 라이선스가 부여되는 경우가 더 많지만, Readline은 GPL로 배포된다.[2]
3. GNU Readline 라이선스
GPLv3 라이선스 라이브러리에 링크하려면 GPL 섹션 5를 준수해야 하며, 배포 시 전체 결합된 결과 애플리케이션이 GPLv3에 따라 라이선스가 부여되어야 한다.[3][4] 이러한 라이선스 정책은 FSF가 소프트웨어가 GPL로 전환되기를 바라는 마음으로 선택되었다.[5]
GNU Readline의 카피레프트 조건을 준수하기 위해 라이선스를 변경한 예로는 CLISP(Common Lisp의 구현체)가 있다. 1987년에 처음 출시되었으며, 1992년에 GPL 라이선스로 변경되었다.[6] 리처드 스톨먼은 CLISP의 원래 저자 중 한 명인 브루노 하이블과의 이메일 교환에서, Readline을 CLISP에 연결하면 하이블이 Readline을 사용하는 CLISP 구현을 배포하려면 CLISP에 대해 GPL에 따라 소프트웨어 재라이선스를 해야 한다고 주장했다.[7][8]
GPLv3와 호환되지 않는 라이선스로 배포되는 프로그램 중에는 Readline을 선택적 기능으로 사용하는 경우가 있다. 이 경우 사용자가 빌드할 때 Readline을 사용할지 여부를 지정한다. 리처드 스톨먼과 브루노 하이블 간의 전자 메일[19]에서는 "프로그램을 자유롭게 만들 때까지(GPLv3 호환 라이선스로 변경할 때까지) Readline의 사용을 중지해야 한다"고 언급하고 있다.
3. 1. 대체 라이브러리
GPL 라이선스가 아닌 다른 라이선스로 배포되는 대체 라이브러리도 존재한다.
4. 문제점
알려진 버그와 제한 사항이 있다. 일부 기능은 문서에 기재된 대로 동작하지 않으며(예: 로컬 에코를 비활성화할 수 없음), 키 바인딩을 삭제할 수 없다.[1]
5. 샘플 코드
cpp
#include
#include
#include
#include
#include
int main()
{
char* input, shell_prompt[100];
// 탭 키를 눌렀을 때 경로를 자동 완성하도록 readline을 구성한다.
rl_bind_key('\t', rl_complete);
for(;;) {
// 사용자 이름과 현재 작업 디렉토리로 프롬프트 문자열을 만든다.
snprintf(shell_prompt, sizeof(shell_prompt), "%s:%s $ ", getenv("USER"), getcwd(NULL, 1024));
// 프롬프트를 표시하고 입력을 읽는다. (참고: 입력은 사용 후 해제해야 한다)...
input = readline(shell_prompt);
// EOF를 확인한다.
if (!input)
break;
// 히스토리에 입력을 추가한다.
add_history(input);
// 작업을 수행한다.
// 입력을 해제한다.
free(input);
}
}
```
다음은 C로 작성된 또 다른 예제 코드이다.
```cpp
#include
#include
#include
#include
int main()
{
// 탭 키를 눌렀을 때 경로를 자동 완성하도록 readline을 구성한다.
rl_bind_key('\t', rl_complete);
// 히스토리 활성화
using_history();
while (1) {
// 프롬프트를 표시하고 입력을 읽는다.
char* input = readline("prompt> ");
// EOF 확인
if (!input)
break;
// readline 히스토리에 입력을 추가한다.
add_history(input);
// 작업 수행.
// readline이 할당한 버퍼를 해제한다.
free(input);
}
return 0;
}
```
위 코드들은 컴파일 시 `-lreadline` 플래그를 사용하여 컴파일해야 한다.[1]
6. 바인딩
Readline은 C 언어 외에도 다양한 프로그래밍 언어에서 사용할 수 있도록 바인딩을 제공한다.
다음은 Readline에 대한 언어 바인딩을 제공하는 주요 프로그래밍 언어들이다.
- 파이썬: 내장 `readline` 모듈[17]
- 루비: 내장 `readline` 모듈
- 펄: 서드파티 (CPAN) `Term::ReadLine` 모듈, 특히 GNU Readline의 경우 `Term::ReadLine::Gnu` 모듈
이러한 바인딩에 따라 Readline의 대안 지원 여부가 달라진다.
참조
[1]
웹사이트
pty(7) - Linux manual page
https://man7.org/lin[...]
2021-09-30
[2]
웹사이트
GNU Lesser General Public License
https://www.gnu.org/[...]
Free Software Foundation
2011-09-03
[3]
웹사이트
GNU General Public License
https://www.gnu.org/[...]
Free Software Foundation
2011-09-03
[4]
웹사이트
Frequently Asked Questions about the GNU licenses
https://www.gnu.org/[...]
Free Software Foundation
2011-09-03
[5]
웹사이트
Why you shouldn't use the Lesser GPL for your next library
https://www.gnu.org/[...]
Free Software Foundation
2019-10-15
[6]
웹사이트
CLISP copyright notice
http://clisp.cvs.sou[...]
CLISP repository
2011-09-03
[7]
웹사이트
Why CLISP is under GPL
https://gitlab.com/g[...]
CLISP repository
2023-01-19
[8]
웹사이트
License - why GNU GPL?
http://www.clisp.org[...]
CLISP team
2011-09-03
[9]
웹사이트
editline(3) - NetBSD Manual Pages
https://man.netbsd.o[...]
2022-09-13
[10]
웹사이트
Editline Library (libedit)
https://thrysoee.dk/[...]
[11]
웹사이트
MariaDB/server/blob/10.2/BUILD/SETUP.sh
https://github.com/M[...]
MariaDB Foundation
2017-10-24
[12]
웹사이트
php/php-src/tree/master/ext/readline
https://github.com/p[...]
The PHP Group
2017-10-24
[13]
웹사이트
antirez/linenoise
https://github.com/a[...]
2020-05-10
[14]
웹사이트
Applications and libraries
https://wiki.haskell[...]
haskell.org
2017-10-24
[15]
웹사이트
judah/haskeline: A Haskell library for line input in command-line programs
https://github.com/j[...]
2017-10-24
[16]
웹사이트
PowerShell/PSReadLine: A bash inspired readline implementation for PowerShell
https://github.com/P[...]
2023-12-20
[17]
웹사이트
Module: Readline (Ruby 3.0.2)
https://ruby-doc.org[...]
[18]
문서
https://lists.gnu.or[...]
[19]
웹사이트
Why CLISP is under GPL
http://clisp.cvs.sou[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com