최근에 새로운 사이드 프로젝트를 시작했습니다. 조금은 새로운 분야를 개발해보려고 하는데 CLI 프로그래밍입니다.
CLI는 Command Line Interface로 '글자를 입력하여 컴퓨터에 명령을 내리는 방식'을 의미합니다.
데스크탑용 프로그램을 개발하려하는데, GUI를 만들기전에 API를 직접 CLI로 만들어서 사용성을 높이는 프로젝트를 해보려합니다.(물론 효용성이 더 떨어질 수도 있겠지만요.)
I
Programing
테스트해본 개발 환경은 ubuntu22.04, 20.04 클라우드 환경에서 테스트해보았습니다.
언어는 여러 선택지가 있었는데, 일단은 이식성이 좋은 cpp로 개발해보고, 너무 불편하다 싶으면 JS 라이브러리가 괜찮은게 있길래 써볼까도 고려중입니다. -> commander - npm (npmjs.com)
1. GNU 컴파일러 설치
sudo apt-get update
sudo apt-get install gcc
sudo apt-get install g++
2. 명령어 테스트용으로 'ls' 명령어를 카피한 exls.cpp 이라는 이름으로 아래와 같이 사용할 수 있습니다.
#include <iostream>
#include <dirent.h>
#include <sys/types.h>
#include <vector>
#include <string>
int main() {
DIR *dir;
struct dirent *entry;
dir = opendir(".");
if (dir == NULL) {
std::cerr << "Error opening directory." << std::endl;
return 1;
}
std::vector<std::string> files;
while ((entry = readdir(dir)) != NULL) {
files.push_back(entry->d_name);
}
closedir(dir);
for (const std::string &file : files) {
std::cout << file << std::endl;
}
return 0;
}
3. g++로 컴파일 해줍니다. output 파일명은 exls(사용할 명령어)로 해줍니다.
g++ exls.cpp -o exls
3-1. 만약 에러가 나면 ncurses 라이브러리의 사용을 명시해주지 않아서 생긴일입니다.
/usr/bin/ld: /tmp/ccg0aDGu.o: in function `main':
exls.cpp:(.text+0x20): undefined reference to `initscr'
/usr/bin/ld: exls.cpp:(.text+0x25): undefined reference to `noecho'
/usr/bin/ld: exls.cpp:(.text+0x2a): undefined reference to `cbreak'
/usr/bin/ld: exls.cpp:(.text+0x31): undefined reference to `stdscr'
/usr/bin/ld: exls.cpp:(.text+0x3e): undefined reference to `keypad'
/usr/bin/ld: exls.cpp:(.text+0x43): undefined reference to `clear'
/usr/bin/ld: exls.cpp:(.text+0x54): undefined reference to `printw'
/usr/bin/ld: exls.cpp:(.text+0x7c): undefined reference to `printw'
/usr/bin/ld: exls.cpp:(.text+0x83): undefined reference to `stdscr'
/usr/bin/ld: exls.cpp:(.text+0x8b): undefined reference to `wgetch'
/usr/bin/ld: exls.cpp:(.text+0x90): undefined reference to `endwin'
/usr/bin/ld: exls.cpp:(.text+0x1b9): undefined reference to `mvprintw'
/usr/bin/ld: exls.cpp:(.text+0x1d8): undefined reference to `stdscr'
/usr/bin/ld: exls.cpp:(.text+0x1e0): undefined reference to `wgetch'
/usr/bin/ld: exls.cpp:(.text+0x1f7): undefined reference to `endwin'
collect2: error: ld returned 1 exit statu
3-2. 아래와 같이 -lcurses를 붙여서 명시해줍니다.
g++ exls.cpp -o exls -lcurses
4. 이후 전역적으로 명령어를 사용하기 위해 /usr/local/bin 폴더에 생성된 바이너리 파일을 옮겨줍니다.
이때, 2가지 방법이 있는데 직접 exls 파일을 copy 하는 방법이 있고,
ln 명령어로 심볼링링크를 생성해서 바로가기 처럼 수정에 대한 유연성을 높일 수도 있습니다.
// #1
sudo cp exls /usr/local/bin/
// #2
sudo ln -s /path/to/exls /usr/local/bin/exls
* 리눅스 명령어는 주로 /bin 이나 /sbin 폴더에 저장되는데, 이것과 관련해서 아래 블로그에 상세히 나와있어서 참고해보시면 좋을 것 같습니다.
- [Wiki] '/bin' 디렉토리와 '/usr/bin' 디렉토리의 차이는 무엇일까? ('/bin' vs '/usr/bin') (wookiist.dev)
5. 해당 명령어에 실행권한을 부여해줍니다.
chmod +x /usr/local/bin/exls
아래와 같이 ls를 했을 때 처럼 명령어가 잘 나오는 걸 볼 수 있습니다.
추가적으로 고려해야할 사항
- linux 기반이 아닌 MacOS와 Window에서도 잘 작동하게 할 수 있는가
- root 권한이 아닌 일반사용자 권한일 때도 실행할 수 있도록 할건가
- window를 예로 들면 exe 파일을 실행했을 때 자동으로 설치될 수 있도록 할건가
차차 개발하면서 정리해보겠습니다.
'개발' 카테고리의 다른 글
[Github Codespaces] 깃헙 코드스페이스에서 Node.js 버전 변경하기 (0) | 2023.08.02 |
---|---|
[Web] 9편 - Ubuntu 20.04에서 Apache2를 사용하여 3000포트를 포트 바꿔서 배포하기 (0) | 2022.06.04 |
[Web] 8편 - (1) React, Node.JS 연동해서 사용해보기 (0) | 2022.06.04 |
[Web] - 7편 (1) Svelte 시작 및 초기 세팅(routing, auth) 소감 (0) | 2022.04.18 |
[Web] - 3편 포트 설정 및 서브 도메인 연결 (0) | 2021.10.07 |