본문 바로가기
프로그래밍 놀이터/Script(Python)

[책 정리] 03. 기본 bash 쉘 명령 - 리눅스 커맨드라인 쉘 스크립트 바이블

by 돼지왕 왕돼지 2020. 4. 22.
반응형

쉘 시작하기


-

/etc/passwd 파일에는 모든 시스템 사용자 계정의 목록이 각 사용자에 대한 몇 가지 기본 구성 정보와 함께 포함되어 있다.


ex)

christine:x:501:501:Christine Bresnahan:/home/christine:/bin/bash


각 항목은 일곱 개의 데이터 필드를 가지며, 각 필드는 콜론으로 구분된다.

이 중 마지막 필드가 기본 쉘 프로그램을 지정한다.

bash 쉘 대신 tcsh, dash 등을 설정할 수도 있다.




쉘 프롬프트 사용하기




bash 설명서와 상호작용하기


-

man 명령으로 리눅스 시스템에 저장된 설명서 페이지에 접속할 수 있다.

man 명령 다음 특정한 명령 이름을 입력하면 된다.



-

bash 쉘을 처음 사용하는 경우라면 man 페이지가 처음에는 큰 도움이 되지 않는다고 생각할 수 있다.

이를 활용하는 습관을, 특히 명령의 DESCRIPTION 섹션에 있는 첫 문장을 읽는 습관을 들여라.

시간이 지나면 기술적 용어에 익숙해지고 man 페이지는 더 많은 도움을 줄 것이다.



-

man 명령을 사용하면 pager 라는 것이 함께 표시된다.

페이저는 표시된 텍스트를 페이지 단위로 탐색할 수 있는 유틸이다.

스페이스 바를 눌러 man 페이지를 페이지 단위로 탐색하거나, Enter 키로 한 줄씩 넘어갈 수 있다.

텍스트를 앞뒤로 움직이려면 화살표 키를 사용할 수 있다.

다 봤으면 q 로 끝낸다.



-

명령의 이름을 기억할 수 없을 때는 -k 옵션을 사용하면 된다.

$ man -k [keyword] 



-

man 페이지에서 관례적으로 이름이 붙은 섹션 말고도 man 페이지 섹션 영역도 있다.

각 섹션 영역은 1~9 까지 번호가 붙어 있으며 의미는 다음과 같다.

1. 실행 프로그램이나 쉘 명령

2. 시스템 호출

3. 라이브러리 호출

4. 특수 파일

5. 파일 형식 및 규칙

6. 게임

7. 개요, 관례 및 그밖

8. 슈퍼 사용자 및 시스템 관리 명령

9. 커널 루틴


일부 명령은 여러 섹션 내용 영역에 걸친 설명서 페이지를 가지고 있다.

예를 들어 hostname 명령어에 대한 섹션 7 man 페이지를 보여면 아래와 같이 한다.

$ man 7 hostname


일반적으로 man 유틸은 명령에 대한 가장 낮은 번호의 내용 영역을 제공한다.


섹션 내용 영역 그 자체에 대한 안내글도 읽어볼 수 있다.

$ man 3 intro 



-

참조를 위해 활용할 수 있는 정보는 man 페이지만 있는 것이 아니다.

인포 페이지(info page)라는 정보 페이지도 있다.

$ info [명령어]



-

대부분의 명령어는 -help 또는 --help 옵션을 받아들인다.

$ hostname --help




파일 시스템 탐색하기


* 리눅스 파일시스템 들여다보기


-

리눅스는 드라이브 문자와 패스 이름을 사용하지 않는다.

윈도우에서는 컴퓨터에 설치된 물리적인 드라이브가 파일의 경로 이름을 결정한다. A, B, C 와 같은 문자를 배당하고 각 드라이브는 그 안에 저장된 파일에 접근하기 위한 자체적인 디렉토리 구조를 가지고 있다.


리눅스에서는 이런 방법을 사용하지 않는다.

리눅스는 가상 디렉토리(virtual directory)라고 하는 단일 디렉토리 구조 안에 파일을 저장한다.

가상 디렉토리는 컴퓨터에 설치된 모든 저장장치를 단일 디렉토리 구조로 병합한 파일 경로를 포함하고 있다.



-

리눅스 가상 디렉토리 구조는 루트(root)라는 단일 기본 디렉토리를 가지고 있다.

(리눅스 파일 경로에서는 백슬래시(\) 대신 슬러시(/) 를 사용한다.)


예를 들어 /home/Rich/Documents/test.doc 이 있다면 이 경로는 파일이 저장되어 있는 물리적 디스크에 관한 어떤 정보도 제공하지 않는다.

리눅스 가상 디렉토리에서 까다로운 부분은 각각의 저장장치를 포함하는 방법이다.

리눅스 시스템에 설치된 첫 번째 하드 드라이브를 루트 드라이브라고 한다.

루트 드라이브에는 가상 디렉토리 코어가 포함되어 있다.

다른 모든 것들은 루트를 시작으로 구성된다.



-

루트 드라이브에서 리눅스는 마운트 포인트(mount points)라는 특수한 디렉토리를 사용할 수 있다.

마운트 포인트는 가상 디렉토리 안에서 추가 저장장치에 할당할 수 있는 디렉토리다.

리눅스는 물리적으로 다른 드라이브에 저장되어 있다고 하더라도 파일과 디렉토리를 마운트 포인트 디렉토리 안에 표시한다.



-

종종 시스템 파일은 루트 드라이브에 물리적으로 저장된다.



-

리눅스 파일시스템 구조는 원래 유닉스 파일 구조에서 진화된 것이다.


/ : 가상 디렉토리의 루트, 보통 어떤 파일도 배치되지 않는다.

/bin : 바이너리 디렉토리, 많은 사용자 수준 GNU 유틸이 저장된다.

/boot : 부트 디렉토리, 부팅 파일이 저장된다.

/dev : 장치 디렉토리, 리눅스가 장치 노드를 생성한다.

/etc : 시스템 구성파일 디렉토리

/home : 홈 디렉토리, 리눅스가 사용자 디렉토리를 만드는 장소

/lib : 라이브러리 디렉토리, 시스템 및 앱 라이브러리 파일이 저장된다.

/media : 미디어 디렉토리, 이동식 미디어에 사용되는 마운트 포인트를 위한 공통적인 장소

/mnt : 마운트 디렉토리, 이동식 미디어에 사용되는 마운트 포인트를 위한 또 다른 공통적인 장소

/opt : 옵션 디렉토리, 타사 소프트웨어 패키지와 데이터 파일을 저장하기 위해 자주 쓰인다.

/proc : 프로세스 디렉토리, 현재의 하드웨어와 프로세스 정보가 저장된다.

/root : 루트 홈 디렉토리

/sbin : 시스템 바이너리 디렉토리, 많은 관리자 수준 GNU 유틸이 저장되어 있다.

/run : 실행 디렉토리, 시스템이 구동되는 동안 런타임 데이터를 보유한다.

/srv : 서비스 디렉토리, 로컬 서비스가 파일을 저장한다.

/sys : 시스템 디렉토리, 시스템 하드웨어 정보 파일이 저장된다.

/tmp : 임시 디렉토리, 임시 작업 파일을 만들고 없앨 수 있다.

/usr : 사용자 바이너리 디렉토리, 수많은 사용자 수준 GNU 유틸 및 데이터 파일이 저장

/var : 변수 디렉토리, 로그 파일과 같이 자주 변경되는 파일을 위한 장소


공통적인 리눅스 디렉토리의 이름은 파일시스템 계층 표준(filesystem hierarchy standard, FHS)을 기반으로 한다.



* 디렉토리 둘러보기




파일 및 디렉토리 목록 보기


* 기본 목록 표시하기


-

ls (list) 명령은 알파벳 순서로 가로 방향으로 정렬해서 목록을 표시한다.

LS_COLORS 환경 변수로 여러 유형의 항목을 각각 다른 색상으로 표시할 수 있다.


컬러 터미널 에뮬레이터가 없는 경우 파일과 디렉토리를 쉽게 구분하기 위해서 -F 옵션를 사용해 쉽게 식별하여 볼 수 있다.

-F 옵션은 폴더에는 / 를 붙여서 쉽게 식별할 수 있게 하고, 실행 가능한 파일에는 * 를 붙여준다.


숨겨진 파일을 표시하려면 -a 옵션를 사용한다.

-R 은 재귀 옵션으로 현재 디렉토리의 하위 디렉토리에 포함된 파일을 보여준다.


참고로 옵션들은 각각 따로가 아닌 -aFR 과 같이 묶어서 쓸 수 있다.



* 긴 목록을 표시하기


-

-l 옵션은 목록을 긴 형식으로 표시한다.

다음과 같은 정보들을 볼 수 있다.


파일 유형 : 디렉토리(d), 파일(-), 링크된 파일 (l), 캐릭터 장치(c), 문자 장치(b) 등

파일 권한

파일 하드 링크의 수

파일 소유자의 사용자 이름

파일의 주 그룹 이름

파일의 바이트단위 크기

파일을 마지막으로 수정한 시각

파일 이름이나 디렉토리 이름



* 목록 출력 필터링하기


-

ls 마지막 매개변수로 필터를 포함시킬 수 있다.

필터는 표준 와일드카드 문자를 인식하고 필터 안에서 패턴에 일치하는 것을 찾아내는데 활용한다.

? 는 하나의 문자에 매칭되며, * 는 0개 혹은 여러개의 문자에 매칭된다.


필터에서 별표와 물음표를 사용하는 것을 파일 글로빙(file globbing)이라 한다.

파일 글로빙은 와일드 카드로 패턴 매칭을 처리하는 것이다.

대괄호를 사용하여 optional matching 도 할 수 있다. (정규식의 것과 같다.)

대괄호 안에 느낌표(!) 를 사용해여 패턴 일치에 포함되서는 안 되는 것들을 지정할 수도 있다.


ex) 

$ ls -l f[!a]ll # fall 은 나오지 않는다.




파일 다루기


* 파일 만들기


-

빈 파일을 만들어야 할 때는 touch 명령을 사용한다.

$ touch test_one


touch 명령은 파일 "수정 시각"을 변경하기 위해 쓰일 수도 있다. 이는 파일 내용을 바꾸지 않는다.

파일의 "사용 시각"만 변경하려면 -a 옵션를 사용한다.

$ touch -a test_one

$ ls -l --time=atime test_one #atime 은 access time 인듯, --time option 은 모든 ls 에서 지원하지는 않는다.



* 파일 복사하기


-

cp 명령을 사용할 때 대상 파일이 이미 존재하는 경우 덮어 쓸 것인지 반드시 물어보도록 -i 옵션을 붙이는 것이 좋다.



-

파일을 디렉토리로 복사하는 경우 디렉토리라는 것을 명확히 하기 위해 / 를 붙여주는 것이 좋다.

만약 /home/test/Documents 라는 디렉토리로 복사하라는 의도로 / 없이 사용한 경우 해당 디렉토리가 존재하는 경우 문제가 되지 않지만, 없는 경우 /home/test/Documents 라는 파일을 만들며 그곳에 복사를 한다.



-

-R 옵션을 사용하면 전체 디렉토리의 내용을 복사할 수 있다.

cp 명령에서도 와일드카드 메타 문자를 사용할 수 있다.



* 탭 자동 완성 기능 활용하기



* 파일 링크하기


-

시스템에서 같은 파일에 대한 두 개(또는 그 이상)의 사본을 유지해야 하는 경우 따로 물리적 사본을 만들 필요 없이 딱 하나의 물리적 원본과 여러 개의 가상 사본인 링크(link)를 쓸 수 있다.

링크는 어떤 디렉토리에 있으면서 파일의 실제 위치를 가리키는 표식이다.

두 가지 유형의 파일 링크를 리눅스에서 사용할 수 있다.

1. 심볼릭 링크(symbolic link)

2. 하드 링크(hard link)



-

심볼릭 링크는 가상 디렉토리 구조에 어딘가에 있는 다른 파일을 가리키는 단순한 물리적 파일이다.

서로 연결된 두 개의 파일은 똑같은 내용을 공유하지 않는다

심볼릭 링크를 만들기 위해서 ln 명령을 -s 옵션과 함께 사용할 수 있다.

$ ln -s data_file sl_data_file


결과를 ls -l 로 보면 sl_data_file -> data_file 과 같은 정보가 함께 표시된다.

이는 심볼릭 링크를 설명한다.


또한 두 파일의 내용은 다르다.

원본 파일과 심볼릭 링크 파일의 크기도 다를 것이다.

심볼릭 링크 파일의 경우 원본 파일에 대한 참조만 가지고 있다고 보면 된다.

당연히 이 둘은 inode 번호도 다르다.

파일이나 디렉토리의 inode 번호는 커널이 파일시스템에 있는 각 개체에 할당되는 고유 식별 번호다. ls -i 옵션을 통해 볼 수 있다. (가장 앞에 표시된다.)



-

하드 링크는 원본 파일에 대한 정보 및 그 파일이 어디에 있는지를 포함하고 있는 별개의 가상 파일을 만든다.

그러나 이 둘은 물리적으로 같은 파일이다.

하드 링크 파일을 참조할 때는 원래의 파일을 참조하는 것과도 같다.

하드 링크를 만들 때는 옵션 없이 ln 명령을 사용하면 된다.

$ ln code_file hl_code_file


하드 링크된 파일은 원본 파일과 inode 번호를 공유한다.

물리적으로 같은 파일이기 때문이다.

또한 링크 횟수도 증가하여 표시된다.



-

파일 사이의 하드 링크는 같은 물리적 매체 안에서만 만들 수 있다.

서로 다른 물리적 매체에 있는 파일 사이에 링크는 심볼릭 링크만 가능하다.



-

링크된 파일을 복사할 때에는 주의해야 한다.

다른 원본 파일에 링크된 파일을 cp 명령으로 복사했다면 원본 파일의 또 다른 사본을 만드는 결과가 된다.



* 파일 이름 바꾸기


-

mv 명령은 파일 및 디렉토리를 다른 위치로 옮기거나 이름을 바꾸는 일에 사용된다.

이는 inode 번호를 바꾸지 않는다.

( mv 명령도 -i 옵션을 사용하면 파일에 덮어쓰려고 하기 전에 확인을 받는다. )



* 파일 지우기


-

rm 명령을 사용하며, 정말 지울지 confirm 을 받기 위해 -i 를 사용할 수 있다.

쉘은 휴지통이 없기 때문에 파일을 제거하고 나면 영원히 사라진다. 따라서 rm 명령에 항상 -i 옵션를 붙이는 것이 좋은 습관이다.

여러 개의 파일을 한번에 제거하기 위해 와일드카드 메타 문자를 사용할 수도 있다.



-

어떤 상황으로 파일을 제거하기 어려운 경우가 있는데, 그래도 강제로 제거하고 싶다면 -f 옵션를 사용한다.




디렉토리 관리하기


* 디렉토리 만들기


-

하위 디렉토리까지 한번에 만들려면 -p 옵션을 주면 된다.

$ mkdir -p new_dir/sub_dir/under_dir


-p 옵션은 필요에 따라 아직 만들어지지 않은 상위 디렉토리를 만든다.



* 디렉토리 지우기


-

기본적으로 rmdir빈 디렉토리를 제거하기 위해서만 쓰일 수 있다.

rmdir 은 디렉토리 삭제를 묻는 -i 옵션이 없다. 빈 디렉토리만 제거하기 때문이다.



-

비어 있지 않은 디렉토리 전체에 rm 명령을 사용할 수 있다.

-r (-R 도 동일)옵션을 사용하면 디렉토리로 내려가서 파일들을 제거하고 나서 마지막으로 디렉토리를 제거한다. 

rm 은 -i 옵션을 사용할 수 있다.

확인과정 없이 한번에 삭제하려면 -rf 옵션을 주면 된다.

그러나 -rf 명령은 어떤 경고도 알림도 없어 매우 위험한 도구이니 주의해서 사용해야 한다.



-

tree 는 디렉토리, 하위 디렉토리, 그리고 그 안의 파일들을 멋지게 보여준다.




파일 내용 보기


* 파일 유형 보기


-

file 명령은 파일의 내부를 살펴보고 어떤 종류의 파일인지 판단할 수 있다.

$ file [fileName]



* 파일 전체를 보기


** cat 명령 사용하기


-

$ cat [fileName]

-n 옵션은 line number 를 보여준다.

-b 는 텍스트가 있는 줄에만 번호를 붙여준다.

-T 는 탭 문자가 표시되는것을 원치 않을 때 사용한다.



** more 명령 사용하기


-

more 명령은 텍스트 파일을 표시하지만 데이터의 각 페이지를 표시한 후 멈춘다.



** less 명령 사용하기


-

less 명령은 실제로는 말장난이며 more 명령을 더욱 발전시킨 버전이다. ( less is more 에서 나온 less... )

less 명령은 텍스트 파일 안을 앞뒤로 오갈 수 있는 아주 편리한 여러가지 기능은 물론 상당히 발전된 찾기 기능도 제공한다.

less 명령은 전체 파일을 다 읽어 들이기 전에 파일의 내용을 표시할 수 있다. (cat 과 more 는 할 수 없다.)

less 는 화살표 키는 물론 page up down 키를 인식한다.




* 파일의 일부를 보기


-

cat 또는 more 명령은 무조건 전체 파일을 읽어 들여야 내용을 볼 수 있다.

정보가 파일의 가장 끝에 있을 경우에는 마지막 줄을 보기 위해 수천 줄의 텍스트를 해치고 나아가야 한다.



** tail 명령 사용하기


-

tail 명령은 파일의 마지막 줄들(파일의 꼬리)을 표시한다.

이 명령은 기본값으로 파일의 마지막 10줄을 표시한다.

$ tail [fileName]

-n 옵션과 숫자를 주면, 그 숫자만큼 표시되는 줄의 수를 바꿀 수 있다.

-f 옵션을 주면 다른 프로세스가 파일을 쓰고 있을 때에도 파일의 내용을 들여다 볼 수 있다. tail 명령은 활성 상태를 유지하고 텍스트 파일에 새로운 줄이 추가되면 이러한 줄이 나타날 때마다 계속해서 표시한다. 이 기능은 실시간 모드에서 시스템 로그 파일을 모니터링하는 좋은 방법이다.



** head 명령 사용하기


-

파일의 처음 몇 줄 (파일의 머리)을 표시한다.

기본값으로 텍스트의 첫 10줄을 표시한다.

$ head [fileName]

-n 옵션과 숫자로 표시하는 줄 수를 바꿀 수 있다.

tail 과 같이 -f 를 지원하지는 않는다.



반응형

댓글