ComputerScience/[운영체제]

[Unix] 유닉스 - 기본적인 쉘 명령어 사용법

NukeOlaf 2020. 9. 10. 22:22

학교에서 객체지향 프로그래밍 수업을 듣고있다. 그런데 실습과제를 학교 리눅스 서버에 접속해서 제출하라고 한다... 예전에 aws 로 내 웹사이트 서버 배포할때 리눅스 명령어를 조금 사용해 보았는데, 다시 리눅스 터미널 창을 보니까 기억이 가물가물하다. 그래서 교수님이 주신 유닉스 쉘 명령어 사용법 유인물을 공부하면서 정리해보았다.

리눅스 운영체제는 유닉스 운영체제로부터 파생되어 만들어졌다. 그래서 리눅스 명령어는 유닉스 명령어와 거의 비슷하다. 유닉스의 기본적인 쉘 명령어를 알아두면, 이를 리눅스에서도 사용할 수 있다.

0. 쉘(Shell) 이란? - 유닉스 또는 리눅스에서

운영 체제 상에서 다양한 운영 체제 기능과 서비스를 구현하는 인터페이스를 제공하는 프로그램

유닉스 운영체제(리눅스와 같은 유닉스 계열 운영체제도 포함)에서 시스템을 위한 사용자 인터페이스를 제공하는 프로그램 이라고 할 수 있다. 명령 줄 인터페이스(CLI, Commend Line Interface) 라고도 불리며, 컴퓨터 키보드를 통해 문자열로 작업 명령을 입력한다. 컴퓨터로부터의 출력 역시 문자열의 형태로 주어진다.

쉘은 운영체제의 커널과 사용자 사이를 연결해준다. 커널은 운영체제의 일부로서, 컴퓨터 메모리에 항상 올라와 있는 프로그램이다. 쉘은 상용자의 명령어를 해석하고 운영체제가 알아들을 수 있게 지시해준다. 다시 운영체제는 쉘에게 받은 명령를 해석하여 하드웨어를 위한 지시어로 바꾸어준다.

즉, 쉘을 사용하여 운영체제에서 제공하는 명령을 실행할 수 있다. 쉘은 운영체제의 관리하에 있는 파일, 프린팅, 하드웨어 장치, 애플리케이션과의 인터페이스를 제공한다. 쉘 스크립트는 인터프리터로서 리눅스 시스템에서 지원하는 명령어들의 집합을 묶어서 프로그램화한 것이다.

 

1. directory 관련 명령어

(1) 새 directory 만들기

mkdir (make directory)

mkdir dir1

새로운 디렉토리 dir1을 만듬

 

(2) working diretory 에 있는 file 보기

ls -l (list long)

ls -l

long option으로 자세히 볼 수 있음, long option 을 주지 않으면 리스트가 간략하게 나옴.

참고 : working directory = current directory(현 디렉토리)

login 직후에는 사용자의 login directory가 working directory가 된다.

 

(3) working directory 이동하기

cd (change directory)

cd dir1

현 디렉토리 밑의 디렉토리 dir1 으로 이동

 

*참고: dot dot(..)은 상위 디렉토리, dot(.)은 현 디렉토리를 의미

cd ..

현 디렉토리 바로 위의 디렉토리로 이동

 

2. password 바꾸기

passwd

passwd를 치고 return하면(엔터를 치면) 현재 암호를 새 암호로 바꿀 수 있다.

 

3. word processor 사용하기

vi (visual editor)

vi f1

f1이라는 이름의 file 을 편집한다.

* 참고 : vi 는 유닉스 환경에서 사용하는 문서 편집기이다. vi 를 이용해서 텍스트 파일을 수정할 수 있다.

 

4. 컴파일러

(1) c++ 컴파일러 사용

g++ -o hw1 hw1.cpp

hw1.cpp 를 컴파일하여 동작 가능한 프로그램 hw1 을 제작한다.

 

(2) c 컴파일러 사용

cc -o hw1 hw1.c

hw1.c 를 컴파일하여 동작 가능한 프로그램 hw1 을 제작한다.

 

* 참고 : cc 의 option 들 : -lm (math library), -ll (lex library), -lpthread (pthread)

ex) -lm 옵션 사용 시, 원시 파일에 #include <math.h> 를 포함해야 한다.

 

5. file 관련 명령어

(1) file 복사

cp (copy)

cp f1 f2

file f1 을 복사하여 f2 를 만든다.

 

(2) file 제거

rm (remove)

rm f1

file f1 을 제거한다.

 

* (wildcard)

rm fi*

이름이 fi 로 시작된되는 모든 file 들을 제거한다.

 

rf (refursive force) 옵션

rm -rf f1

file f1 을 묻지 않고 제거한다. (refursive force)

 

(3) file 이름 바꾸기

mv (move)

mv f1 f2

file f1 의 이름을 f2 로 바꾼다.

 

(4) file 내용 보기

cat (concatenate)

cat f1

file f1 의 내용이 화면에 출력된다. concatenate 는 "사슬 같이 잇다" 라는 뜻으로, 파일 이름을 인자로 받아 그 내용을 쭉 이어주는 역할을 한다.

 

(5) file 의 앞 부분 출력하기

head

head file

file 의 앞 부분 10줄을 출력한다. (특별히 옵션을 부과하지 않으면 10줄 출력)

* 참고 : 숫자를 입력하여 몇 출을 출력할지 지정할 수 있다.

head -n file

file 의 앞 부분 n 줄을 출력한다 (n 은 숫자)

ex) head -5 file (앞의 5줄을 출력한다.)

 

(6) file 의 뒷 부분 출력하기

tail

tail file

file 의 뒷 부분 10줄을 출력한다. (특별히 옵션을 부과하지 않으면 10줄 출력)

 

* 참고 : 숫자를 입력하여 몇 출을 출력할지 지정할 수 있다.

tail -n file

file 의 뒷 부분 n 줄을 출력한다.

 

6. redirection (재지향)

입출력 및 오류에 대한 표준 스트림

redirection 은 표준 스트림의 흐름을 바꿔주는 것이다. 기본적으로 프로그램은 연산 결과를 출력 장치(파일, 모니터, 프린터 등)로 내보낸다. 이 출력되는 데이터를 임의로 다른 장치로 보내는 것을 재지향(redirection) 이라 한다. 즉, 파일이나 프로그램, 명령어 등의 출력을 낚아채어 다른 파일이나 프로그램, 명령어의 표준 입력으로 보내는 것을 말한다.

< (redirect input)

prog < f1

표준 입력을 키보드 대신 f1 이라는 file 에서 받는다.

 

> (redirect output)

prog > f2

표준 출력을 화면 대신 f2 라는 file 로 내보낸다.

 

7. pipe (파이프)

앞 process 의 표준 출력을 뒤 process 가 입력받아 동작하도록 한다.

| (pipe)

ls -l | more

ls -l 의 표준 출력이 more 의 표준 입력이 된다.

* 참고 : more 은 space 를 누를 때마다 다음 page 를 출력하는 명령어이다.

 

8. makefile

(1) aa.cpp 와 bb.cpp 두 개의 file 이 있다. main 함수는 bb.cpp 에 들어있다. 이 때, 동작 가능한 프로그램 bm 만들기

(2) main 함수를 가지고 있는 cm.cpp 를 컴파일/링크하여 동작 가능한 프로그램 cm 만들기

 

makefile 을 사용하지 않는 방법

g++ -o bm bb.cpp aa.cpp
g++ -o cm cm.cpp

 

makefile 을 사용하는 방법

(a) makefile 이라는 이름의 file 을 만든다.

vi makefile

(b) makefile 에 다음과 같이 작성한다.

bm: bb.o aa.o
	g++ -o bm bb.o aa.o
cm: cm.o
	g++ -o cm cm.o

(c) make 명령을 입력한다.

make
make bm
make cm

 

* 참고 : makefile 내의 의존성은 분리컴파일 된 .o 파일을 이용하면 된다.

위에서 makefile 이라는 이름의 아스키 파일을 만든 후 , 쉘 프롬프트에서 'make' 또는 'make bm' 하면 bm 이 제작된다.

'make cm' 하면 cm 이 제작된다.

 

참고 사이트 >>>

ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%89%EC%8A%A4_%EC%85%B8

jhnyang.tistory.com/57

zzsza.github.io/development/2017/12/04/linux-1/

www.tuwlab.com/ece/27193