리눅스와 쉘 명령어에 대해 알아보자

용가리·2024년 9월 20일
1

반갑습니다.
오늘은 자주 사용하는 쉘 명령어들에 대해 소개해보겠습니다.
많은 사람들이 코랩이나 주피터를 사용하실 것 같습니다.
.ipynb파일들이 익숙하시겠죠.
하지만 때로는 회사의 서버를 사용해서 학습을 해야 하는 경우가 생깁니다.
저도 경험해보진 못했지만 취업하면 그렇게 되겠죠(ㅠㅠ)
서버는 대부분 Linux os에서 돌아가기 때문에
.py파일을 CLI환경에서 다뤄야 합니다.
잘 사용하기 위해서는 쉘 명령어에 대해 어느정도 알아야겠죠.
그래서 제가 자주 사용하거나 사용하게 될 명령어들을 좀 정리해봤습니다.

Linux가 뭐죠?

Linux란 서버에서 자주 사용하는 하나의 OS입니다.
오픈소스로 전부 공개되어 있고, Debian, Ubuntu, Redhat, CentOS 등 다양한 버전이 존재합니다.
Unix 기반의 운영체제로 안정적이고 믿을 수 있어 신뢰성과 안정성이 보장됩니다.
쉘 커맨드, 쉘 스크립트로 동작합니다.

서버와 관련된 직군의 사람들이 많이 사용하시는 리눅스입니다.
저도 뭔지는 잘 몰랐는데, 이번 기회에 알게되어 기쁩니다.
왜 Window나 Mac Os로는 서버를 안만들지 생각했는데 만들수 있다더군요.
다만 유료랍니다 (^^)
그래서 오픈소스인 Linux로 서버를 많이들 개설하시는 듯 싶습니다.
리눅스의 버전은 아주 다양한데, Ubuntu가 초보자들이 쉽게 접근할 수 있도록 쉽다고 하네요.
그래서 많은분들이 Ubuntu를 많이 사용하시는군요.

Shell?

Shell이란, 사용자가 컴퓨터에 명령할 수 있도록 하는 프로그램입니다.
Shell Command로 명령을 입력합니다.
sh, bash, zsh 등이 존재합니다.
Linux에서는 bash를 표준 쉘로 사용합니다.

살짝 TMI를 말해보자면 ..
저는 zsh이 뭔지 몰랐습니다.
맥북에서 커맨드를 사용하다 보면 zsh: 이런 글자가 보이잖습니까
저는 조성훈이 자꾸 떠오르더라구요.
그래서 조성훈이라고 맘속으로 불렀었습니다 (참고로 제 지인중에 조성훈이라는 이름을 가진 분은 안계십니다.)

쉘은 어디에 쓸까?

  1. 서버에서 접속해서 사용할 때
  2. 데이터 전처리에도 쓰임.
  3. Docker을 사용할 때
  4. 많은 서버를 관리할 때
  5. jupyter notebook / lab에서도 !를 붙이면 쉘 커맨드가 사용됨
  6. 깃허브에서도 배포된 파일을 실행할 때 sh 커맨드로 한번에 실행할 수 있도록 함.

핵심적인 기능들을 이용하는 데에 많이 쓰이는군요.
꼭 알아야겠습니다.

기본적인 쉘 커맨드들

정말 많습니다.
리스트로 하나하나 설명해보겠습니다.
(공통적으로 :q를 누르시면 들어간 창에서 나오실 수 있습니다.)

1. man

Manual의 약자.
메뉴얼 문서를 보고싶을 때 사용.
ex) man python3

2. mkdir

Make Dictionary의 약자.
폴더를 만듭니다.

3. ls

List Segments의 약자.
ls 뒤에 아무것도 작성하지 않으면 현재 폴더 기준으로 접근한 폴더의 파일을 확인합니다.

-a : .으로 시작하는 파일까지 전부 출력합니다 (all)
ex) .git, .ds_store 등
-l : 퍼미션, 소유자, 만든 날짜, 용량까지 출력합니다. (long)
-h : 사람이 읽기 쉽도록 GB, MB, KB 등으로 표현합니다. (human-readable)

이런식으로 -lh, -al, -l 등 다양하게 조합하여 사용합니다.

4. pwd

Print Working Directory의 약자.
현재 폴더 경로를 절대 경로로 보여줍니다.

5. cd

Change Directory의 약자.
원하는 폴더로 이동합니다.

ls로 파일들을 보고 cd Documents 같이 이동하는 데에 많이 쓰입니다.

6. echo

Print와 같은 역할을 합니다.
텍스트를 출력하는 역할을 합니다.
echo 'command'로 사용하면 command의 결과를 출력합니다.

에코는 약자가 없습니다.
진짜 목소리 할 때 그 에코라더군요.
echo 'pwd'로 쓰면 현재의 디렉토리를 출력합니다.

7. cp

Copy의 약자.

cp A B 하면 A의 내용을 B에 덮어씁니다.(없을경우 생성)
cp A path 은 A의 내용을 path에 복사합니다.

8. vi

vim 편집기로 파일을 생성합니다.
vi name으로 name을 가진 파일을 생성할 수 있습니다.
이후 커맨드로 내용을 입력/삭제할 수 있습니다.

커맨드를 몇개 알아보자면
1. dd : 현재 위치한 한 줄 삭제
2. i : INSERT 모드로 변경
(i를 눌러야 메모장처럼 작성할 수 있습니다)
3. x : 커서 위치의 글자 1자를 삭제.
4. yy : 현재 줄을 복사
5. p : 현재 커서가 있는 줄 바로 아래에 붙여넣기

vi script.sh로 쉘 파일을 생성하면 bash script.sh로 파일을 실행시킬 수 있습니다.


글자가 작군요 죄송합니다.
이런식으로 사용하실 수 있습니다.

vim 편집기로 파일을 작성한 뒤, 나가실 때는
:를 누르시고
w : 저장 (write)
wq : 저장하고 나가기 (write and quit)
q : 나가기 (quit)
q! : 저장하지 않고 강제로 나가기 (quit force)
로 나오실 수 있겠습니다.

9. sudo

Superuser do 의 약자.
관리자 권한으로 실행합니다.

뭔가를 하실 때 안되면 sudo를 붙여서 해보는 것도 방법이 될 수 있겠습니다.
참고로
sudo rm -rf/를 입력하면 컴퓨터에 존재하는 파일을 전부 삭제한다는군요.
ㅎㅎ
궁긍하시면 한번 해보셔도 좋을 것 같습니다.

10. mv

Move의 약자.
파일, 폴더를 이동합니다.

mv A B로 사용시 A 파일의 이름을 B로 변경합니다.
mv A path로 사용시 A 파일을 path로 이동시킵니다.

11. cat

Concatenate의 약자.
특정 파일의 내용을 출력합니다.

cat scripttest.sh라고 치시면 echo "해위"가 출력됩니다.
이 cat은 다양한 방면으로 응용이 가능한데

cat vi_file_1.sh vi_file_2.sh라고 치시면 두 파일이 실행됩니다.

cat vi_file_1.sh vi_file_2.sh > vi_file_3.sh라고 치시면 vi_file_3.sh파일에 file1과 file2가 저장됩니다.

'>'를 한개만 사용한다면 Overwrite 합니다.
만약 '>>'라면 덮어쓰지 않고 Append합니다.

12. clear

터미널 창을 깨끗하게 해줍니다.

13. history

여태까지 입력한 쉘 커맨드 기록을 출력합니다.


옆에 보시면 번호가 떠 있는데
!와 함께 번호를 붙이시면 그 커맨드가 다시 실행됩니다.

14. find

파일 및 디렉토리를 검색할 때 사용합니다.

15. export

환경 변수를 설정할 때 사용합니다.

export me="Yongari" # 변수를 설정합니다.
echo $me #Yongari가 출력됩니다.

주의할 점이 있다면 = 뒤에 딱 붙여서 쓰셔야합니다
me="Yongari" (O)
me = "Yongari" (X)

하지만 이렇게 설정된 변수는 터미널이 꺼지면 사라지게 됩니다.
사라지지 않게 하고 싶다면
vi ~/.bashrc 또는 vi ~/.zshrc (조성훈 ㅋㅋ)
를 입력하고 나오는 vim 편집기 제일 하단에 export me="Yongari"를 입력하시고 :wq를 통해 저장하시고 나오시면 되겠습니다.
그 후에, source ~/.bashrc 나 source ~/.zshrc를 입력하시면 다시 껐다 키지 않으셔도 적용하실 수 있습니다.

16. alias

별칭으로 설정된 것들을 볼 수 있습니다.

터미널에서 alias를 입력시 별칭으로 설정된 것들을 볼 수 있습니다.
alias abc='git add .'라고 지정하면 앞으로 abc를 치면 git add .가 실행되겠죠.
터미널을 자주 쓰시는 분들은 단축키를 지정하시면 편리성을 올릴 수 있겠습니다.

17. tree

폴더의 구조를 계층적으로 표현합니다.
구조를 한눈에 볼 수 있어 편리성이 높습니다.

Tree는 다운을 받아야 쓸 수 있습니다.
apt-get install tree나
brew install tree로 다운받습니다.

사용법은
tree -L 1 (1레벨)
tree -L 2 (2게벨)
등으로 쓸 수 있습니다.

이런식으로 구조를 잘 파악할 수 있게 출력해줍니다.

18. head / tail

파일의 앞/뒤의 n행을 출력합니다.

head(tail) -n 3 scripttest.sh를 입력하면
scripttest.sh의 내용물 중 앞 뒤 n행을 출력할 수 있습니다.

19 sort

출력물을 정렬합니다.
-r (reverse)를 통해 반대로 정렬할 수도 있습니다.

sort는 입력이 있어야 정렬을 할 수 있습니다.
|를 통해 무언가의 출력을 입력으로 받는 형식으로 사용할 수 있습니다.

a|b는 a의 출력을 b로 전달합니다.

20. grep

Global Regular Expression Print의 약자.
파일에 주어진 패턴들과 매칭되는 라인을 검색합니다.
grep 옵션 패턴 파일명으로 사용됩니다.

옵션들은
-i(Insensitively) : 대소문자 구분 없이 찾기
-w : 정확하게 그 단어만 찾기
-v : 특정 패턴을 제외한 결과를 출력
-E : 정규 표현식 사용

정규식은 어디에나 쓰이는 것 같습니다.

ex) grep -i "ga" sorting.sh(파일이름) 를 입력하면 파일에서 "ga"가 있는 내용물을 전부 출력합니다.

21. cut

파일에서 특정 부분을 split합니다.
cut -d 기준 -f 인덱스 로 자를 수 있습니다.

예시를 보시는게 훨씬 빠르게 이해되지 않을까 싶습니다.

22. awk

텍스트 처리 도구입니다.
awk (-F구분자) 'pattern {action}' input_file로 사용할 수 있습니다.

이거 너무 복잡합니다.
예시로 설명해보겠습니다.
echo "Alice 25" | awk '{ print $2 }'라고 치시면
-F로 구분자를 지어주지 않았으므로 자동으로 공백으로 구분되고
Alice와 25중, {action}에 print가 있으므로 2번째인 25가 출력됩니다.

다른 예시를 들어보겠습니다.
awk -F, '{ sum += $3 } END { print sum }' data.csv
라고 치시면 -F뒤에 ,가 나왔으므로 ,로 구분을 하고 ,로 구분된 것 중 세번째 항목을 sum에 저장하고
END니까 마지막에 {action}을 수행합니다. 어디에서? data.csv에서

만약
awk -F: '/^d/ {print $1}' data.csv라면
data.csv에서 :로 구분하고 d로 시작하는 패턴중(정규식) 첫번째 항목을 출력하라는 의미입니다.
..
어렵습니다.
판다스로 도망치고 싶군요.

23. ps

Process Status의 약자.
현재 실행되고 있는 프로세스를 출력합니다.

-e를 통해 모든 프로세스를 볼 수 있습니다.
-f를 붙이면 Full Format으로 자세히 보여줍니다.
PID(Process ID)를 함께 출력합니다.
ps -ef | grep train.py 같이 사용하여 PID를 찾고
kill -9 pid를 통해 프로세스를 종료시킬 수 있습니다. (-9은 SIG KILL으로 강제로 삭제함을 의미)

24. df

Disk Free의 약자.
현재 사용중인 디스크의 용량을 출력합니다.

-h를 붙이면 좀 더 가독성 있게 (GB, MB, KB 등)으로 볼 수 있습니다.

25. chmod

Change mode의 약자.
파일의 권한을 관리합니다.

정보처리기사 문제에도 등장하는 chmod입니다.
chmode (755, 777, 555 등등) file을 통해 file에 권한을 부여합니다.
r = Read = 4
w = Write = 2
x = eXcute = 1

  • = Denied 입니다.
    왜 x만 eXcute일까요 뭔가 불편하네요
    숫자는 총 세개인데, 차례대로 소유자 / 그룹 / 기타 사용자 에게 권한을 준다는 의미입니다.
    만약 755라면 (r+w+x) / (r+x) / (r+x)로 권한을 줬다는 뜻이 되겠습니다.

26. nohup

터미널 종료 후에도 게속 작업이 유지하도록 실행합니다.
nohup name & 으로 실행합니다.

python3 train.py & 와 nohup python3 train.py &의 차이는 뭘까요
둘 다 뒤에 &을 붙이면 백그라운드에서 실행한다는 의미입니다.
하지만 nohup을 붙이면 터미널을 끄거나 종료해도 프로세스가 계속 유지됩니다.
나중에 일하실 때 저렇게 쳐놓고 퇴근하시면 되겠습니다.

Linux 커맨드의 응용

Unix의 표준 입출력

Unix에서 동작하는 프로그램은 커맨드 실행 시 stdin, stdout, stderr 총 세가지의 stream이 생성됩니다.
stdin은 0, stdout은 1, stoerr는 2로 표현됩니다.

예를 들어, 우리가 서버에서 AI 모델을 학습시킨다고 생각해봅시다.
그렇다면 커맨드라인에서 python3 train.py를 실행시키겠죠
이 때, python train.py > log_file 2>&1 &라고 입력하면
2>&1 : 표준 에러(2)를 표준출력(1)로 리다이렉트 합니다.
이를 통해 에러 메세지를 logfile에 저장할 수 있습니다.
& : 백그라운드에서 실행하도록 지시합니다.

즉, 모델을 훈련시키고 에러가 뜬다면 로그파일에 기록하도록 명령하는 것이죠.
또 &를 통해 백그라운드에서 실행하도록 지시하여 우리가 서버를 나가도 프로그램이 계속 돌고 있도록 할 수 있습니다.

|와 >는 자주 쓰이니 사용법을 제대로 아는 것이 중요하겠습니다.

sh파일 작성

위에서 소개한 내용들을 AI 개발자가 어떻게 활용할 수 있을까요?
하나의 프로젝트 폴더에 train.py inference.py data.csv 등 파일을 넣고
model.sh 파일에
echo "모델 훈련중..."
nohup python3 train.py &
echo "모델 훈련완료. inference를 시작합니다."
nohup python3 inference.py &
echo "추론이 끝났습니다."
뭐 이런식으로 작성하면
처음 접하는 사용자가 py를 건드릴 필요 없이 bash model.sh만 치면 학습부터 추론까지 끝낼 수 있겠죠.
이런식으로 활용할 수 있다고 생각하시면 되겠습니다.

'
'
'
이로서 리눅스와 쉘 명령어들에 대한 소개를 마칩니다.
리눅스는 아주 큰 오픈소스이기에 제 블로그 글 하나로는 100분에 1도 담지 못합니다.
하지만 이 글이 쉘 스크립트가 뭐가 뭔지 정도는 아는 데에 어느정도 도움이 될거라 생각합니다.
감사합니다 !

0개의 댓글