쉘 학습(2)

리다이렉션

표준 입출력과 표준 오류

  • 출력은 두 가지 형식을 포함
    1. 프로그램의 결과. 즉, 프로그램이 출력하도록 설계한 데이터
    2. 프로그램이 어떻게 돌아가고 있는지를 말해주는 상태 및 오류 메시지 형식
  • I/O 리다이렉션 기능으로 출력과 입력의 방향 변경 가능

표준 출력 재지정
  • 화면에 출력하는 대신 다른 파일에 출력하도록 할 수 있음
  • 명령어 출력결과를 파일에 저장하는 것이 종종 유용하기 때문
ls -l /usr/bin > ls-output.txt
  • > 리다이렉션 연산자로 출력 방향을 지정할 때, 목적 파일은 항상 처음부터 다시 작성됨

  • 이러한 트릭을 이용하여 빈 파일을 만드는 방법
> ls-output.txt
  • >> 리다이렉션 연산자를 사용하여 파일에 이어 쓰기가 가능해짐


표준 오류 재지정
  • 표준 오류 재지정할 때는 리다이렉션 연산자가 필요 없음
  • 파일 디스크립터를 참조
    • 0, 1, 2번 파일 디스크립터
    • 순서대로 표준 입력, 표준 출력 , 표준 오류
ls -l /bin/usr 2> le-error.txt

표준 출력과 표준 오류를 한 파일로 재지정
ls -l /bin/usr &> ls-output.txt
  • &> 표기가 표준 출력과 표준 오류를 함께 재지정해주는 역할

원치 않는 출력 제거
  • /dev/null 이라는 특수한 파일로 출력 방향을 지정함으로써 출력 결과 버릴 수 있음
  • 비트 버킷이라고 불리는 시스템 장치로 입력을 받고 아무것도 수행하지 않음

표준 입력 재지정
파일 붙이기
  • cat 명령어는 하나 이상의 파일을 읽어 들여서 표준 출력으로 그 내용을 복사
  • 주로 짧은 텍스트 파일을 표시하거나, 파일을 하나로 합치는 데에도 사용 가능
[me@linuxbox~] cat
The quick fox jumped.
The quick fox jumped. // CTRL + D 눌러 EOF 문자 입력

[me@linuxbox~] cat > lazy_dog.txt
The quick fox jumped.
// CTRL + D 눌러 EOF 문자 입력

[me@linuxbox~]cat lazy_dog.txt
[me@linuxbox~]cat < lazy_dog.txt
는 똑같은 기능 수행

파이프라인

  • command1 | command2를 활용하여 표준 출력을 표준 입력으로 활용 가능
ls -l /usr/bin | less

필터
  • 파이프라인은 데이터의 복잡한 연산을 수행할 때 종종 사용
  • 하나의 파이프라인에 여러 명령어의 입력이 가능
ls /bin /usr/bin | sort | less
// 두 디렉토리에 있는 실행 프로그램들을 하나의 목록으로 만들어 정렬한 뒤 보여줌

중복줄 제거 및 표시
  • uniq 명령어는 종종 sort와 함께 사용
# 중복된 내용을 제거해서 보고자 할 때
ls /bin /usr/bin | sort | uniq | less
# 중복된 내용만 보고자 할 때 
ls /bin /usr/bin | sort | uniq -d | less

라인, 단어 개수 및 파일 크기 출력
  • wc 명령어는 파일에 들어있는 라인 - 단어 - 파일 크기의 순으로 출력
wc file.txt
  • -l 옵션은 라인 수만 보고 싶을 때 사용 가능
# 정렬된 목록의 항목 개수를 알고 싶을 때 사용
ls /bin /usr/bin | sort | uniq | wc -l

패턴과 일치하는 라인 출력
  • grep 명령어는 파일 내에서 "패턴"을 만났을 때, 그 패턴을 가지고 있는 라인을 출력
    • grep pattern [file...]
ls /bin /usr/bin | sort | uniq | grep zip
  • -i 옵션은 검색 수행할 때 대소문자 구분하지 않도록 함
  • -v 옵션은 패턴과 일치하지 않는 라인만 출력

파일의 처음/끝 부분 출력
  • head, tail 명령어로 첫 / 마지막 10줄 표시 가능
  • head(tail) -n #로 그 수 조정 가능
  • tail에 -f 옵션 지정하면, 실시간으로 파일 확인 가능
tail -f /var/log/messages

표준 입력에서 데이터 읽고, 표준 출력과 파일에 출력
  • tee 프로그램은 표준 입력으로부터 데이터를 읽어서 표준 출력과 하나 이상의 다른 파일에 동시에 출력
  • 작업이 진행되고 있을 때, 중간 지점의 파이프라인에 있는 내용을 알고 싶을 때 유용
ls /usr/bin | tee ls.txt | grep zip



확장과 인용

확장

  • 쉘은 명령어가 실행되기 직전에 모든 한정 문자들을 한정

  • 위 그림에서 쉘은 * 기호를 확장시킨 후, 디렉토리의 이름으로 확장하여 보여주었음

경로명 확장
echo D*
echo *s
echo /usr/*/share

틸드 확장
# 현재 사용자의 홈 디렉토리명
echo ~

# foo 계정의 홈 디렉토리명
echo ~foo

산술 확장
  • &((expression)) 으로 산술 확장 사용 가능
echo $(((5**2) *3))

중괄호 확장
  • 중괄호 안에 표현된 패턴과 일치하는 다양한 텍스트 문자열 생성 가능

  • 위와 같이 정렬된 디렉토리 생성에 아주 유용하게 사용 가능

매개변수 확장
  • 매개변수를 확장해서 볼 수 있음
  • ex) echo $USER
  • 사용 가능한 변수 목록 보기
    • printenv | less

명령어 치환
  • 명령어 치환으로 명령어의 출력 결과를 확장해서 사용 가능
    • ex) echo $(ls)

따옴표 활용(Quoting)

따옴표 기호를 활용하여 원치 않는 확장을 선택적으로 감출 수 있음

쌍 따옴표 기호

  • 쌍 따옴표 기호를 이용하여 원치 않는 단어 분할 문제 해결 가능
  • 쌍 따옴표가 사용되면, 커맨드라인에서 하나의 명령 인자로 처리
    • 첫 번째 입력은 38개의 명령 인자를 가진 명령어로 인식
    • 두 번째 입력은 빈칸과 개행 문자 포함하여 하나의 명령 인자로 인식

따옴표 기호

  • 모든 확장을 숨겨야 한다면 따옴표 기호 사용

이스케이프 문자
  • 종종 선택적으로 확장을 막기 위해 쌍 따옴표 안에서 사용
  • 또한 파일명에 있는 어떤 문자가 가진 특별한 의미를 없애고 싶을 때 흔히 사용

고급 키보드 기법

커맨드라인 편집

커서 이동
  • CTRL + A: 줄 맨 앞으로 커서 이동
  • CTRL + E: 줄 맨 끝으로 커서 이동
  • ALT + F: 다음 한 단어로 커서 이동
  • ALT + B: 이전 한 단어로 커서 이동

텍스트 수정
  • CTRL + T: 현재 커서 위치에 있는 글자와 바로 앞글자의 위치 바꾸기
  • ALT + T: 현재 커서 위치에 있는 단어와 바로 앞 단어의 위치 바꾸기
  • ALT + L: 현재 커서 위치에 있는 글자부터 그 단어 끝 부분까지 소문자로 바꾸기
  • ALT + U: 현재 커서 위치에 있는 글자부터 그 단어 끝 부분까지 대문자로 바꾸기

  • CTRL + K: 현재 커서 위치로부터 그 줄 끝 부분까지 텍스트 지우기
  • CTRL + U: 현재 커서 위치로부터 그 줄 처음 부분까지 텍스트 지우기
  • ALT + D: 현재 커서 위치에서부터 그 단어 끝 부분까지 텍스트 지우기
  • ALT + BACKSPACE: 현재 커서 위치에서부터 그 단어 앞부분까지 텍스트 삭제하기
  • CTRL + Y: 잘라낸 데이터는 kill-ring이라고 하는 버퍼에 저장되는데, kill-ring에 있는 텍스트를 현재 커서 위치에 삽입

히스토리 활용

  • bash는 입력된 명령어에 대한 히스토리를 저장
  • 히스토리는 홈 디렉토리에 .bash_history라는 파일로 저장
히스토리 검색
  • 기본값으로 bash는 사용자가 입력한 최근 500개의 명령어 저장
  • 출력 결과 중 필요한 명령어가 포함된 줄만을 찾을 수도 있음
    • 이후 !line_number로 해당 명령어 재실행 가능
  • CTRL + R: 역순 증분 검색으로, 현재 커맨드라인에서 히스토리 목록으로 증분 검색
    • bash에 명령을 주면 각 글자가 추가될 때마다 우리가 원하는 검색 결과를 골라서 보여줌
    • 원하는 결과를 찾으면 CTRL + J를 눌러 현재 커맨드라인에 그 명령어 복사 가능

히스토리 확장
  • !!: 마지막 명령어를 반복하여 실행
  • !string: 이 문자열로 시작하는 가장 최근에 입력된 항목 실행
  • !?string: 이 문자열이 포함된 가장 최근에 입력된 항목을 실행

퍼미션

소유자, 그룹 멤버, 기타 사용자

  • id 명령어 통해 자신의 사용자 ID 정보 확인 가능
  • 사용자 ID(uid)와 주 그룹 ID(gid) 존재
  • 사용자 계정은 /etc/passwd 파일에 정의
  • 그룹은 /etc/group 파일에 저으이
  • 사용자 계정과 그룹이 생성되면, 이 파일들은 사용자 비밀번호에 관한 정보를 가진 /etc/shadow에 덧붙여 수정

파일 모드 변경
8진법 표현
  • 0: ---  1: --x  2: -w-  3: -wx  4: r--
  • 5: r-x  6: rw-  7: rwx

기호 표현
  • u: user의 약자로, 파일이나 디렉토리 소유자

  • g: 그룹 소유자

  • o: othres의 약자로, 기타 사용자

  • a: all의 약자로, u,g,o의 조합

  • chmod 기호 표기법 예제

    • u+x: 소유자에게 실행 권한 추가
    • u-x: 소유자에게 실행 권한 제거
    • +x: 모든 사용자에게 실행 권한 추가
    • go=rw: 그룹 소유자와 기타 사용자가 읽기, 쓰기 권한을 갖도록 함

기본 권한 설정

  • 파일 모드 속성에서 제거할 비트 마스크를 표현하는 umask 설정
  • 일반적인 umask의 기본 값은 0002 혹은 0022

사용자 ID 변경

다른 사용자 ID와 그룹 ID로 쉘 실행
  • su - 명령어로 슈퍼유저로 쉘 시작 가능
  • su -c 'command': 새로운 명령어로 시작하지 않고 단일 명령어 수행 가능

다른 사용자로 명령어 실행
  • 사용자는 하나 이상의 지정된 명령어로 제한되고 나머지는 불가
  • sudo -l: sudo로 허용된 특권을 확인하기 위한 옵션
  • sudo는 슈퍼유저의 비밀번호를 요구하지 않음

파일 소유자와 그룹 변경
  • chown [owner][:[group]] file...
  • chown 인자 예제
    • bob: 파일 소유자를 bob으로 변경
    • bob:users: 파일 소유자를 bob으로 변경하고, 파일 그룹 소유자를 users 그룹으로 변경
    • :admins: 파일 그룹 소유자만 admins 그룹으로 변경
    • bob::파일 소유자가 bob으로 변경되고 그룹 소유자는 bob의 로그인 그룹으로 변경

사용자 비밀번호 변경

  • passwd [user] 명령어 통해 자신의 비밀번호 변경 가능
  • 슈퍼유저 특권을 가지고 있다면 첫 번째 인자에 사용자 이름을 지정해서 해당 사용자의 비밀번호 설정 가능

프로세스

프로세스는 어떻게 동작하는가

  • 시스템이 구동될 때, 커널은 몇몇 프로세스를 초기화하고 init이라는 프로그램 실행
  • init은 차례차례 모든 시스템 서비스를 시작하기 위해 init 스크립트라고 불리는 쉘 스크립트 실행

ps 명령어로 프로세스 보기
  • 프로세스를 보는 가장 일반적인 명령어는 ps
  • tty(teletype): 프로세스용 제어 터미널

  • ps aux 명령어로 모든 프로세스를 보여줌
  • 프로세스 상태
    • R: 실행 상태
    • S: 수면 상태
    • D: 인터럽트 불가능한 수면 상태
    • T: 종료 상태
    • Z: 좀비 프로세스
    • <: 높은 우선순위 프로세스
    • N: 낮은 우선순위 프로세스
  • ps 헤더들
    • USER: 사용자 ID
    • %CPU: CPU 사용량
    • %MEM: 메모리 사용량
    • VSZ: 가상 메모리 크기
    • RSS: 사용 메모리 크기
    • START: 프로세스가 시작된 시각

top 명령어로 프로세스 변화 보기

  • top 프로그램은 프로세스가 활동순으로 나열된 시스템 프로세스들을 지속적으로 갱신하여 보여줌
  • 시스템상의 최상위 프로세스들을 보기 위해 사용
  • top 정보 필드
    • up 19days: 시스템이 마지막 부팅된 시점부터 지금까지의 시간
    • 1 users: 로그인한 사용자의 수
    • load average: 평균부하는 실행 대기중인 프로세스 수 의미
    • Tasks: 프로세스 수와 프로세스 상태별 수
    • 0.0 us: CPU의 0.0%를 사용자 프로세스들이 사용 중
    • 0.0 sy: CPU의 0.0%를 시스템(커널) 프로세스에서 사용 중
    • 0.0 ni: CPU의 0.0%를 nice 프로세스가 사용 중
    • 100.0 id: CPU의 100.0%가 유휴 상태
    • 0.0 wa: CPU의 0.0%가 I/O 대기 중
    • Mem: 물리메모리 사용현황
    • Swap: 스왑 영역(가상 메모리) 사용현황

프로세스를 백그라운드로 전환
  • & 기호를 사용하여 프로그램을 백그라운드로 이동 가능
  • jobs 명령어는 터미널에 실행 중인 작업을 나열해주는 기능
    • jobs에서 지정한 작업 번호(jobspec)을 이용하여 fg로 재전환 가능
    • ex) fg %1

프로세스 정지(일시정지)
  • 포어그라운드 프로세스를 정지하기 위해서는 CTRL+Z를 누름
  • 이후, fg 명령어로 프로그램을 포어그라운드로 복원하거나, bg 명령어로 프로그램을 백그라운드로 이동 가능
    • ex) bg %1

시그널

  • kill 명령어는 프로세스를 종료하는 것이 아니라, 프로세스에 시그널을 보내는 것
kill로 시그널 보내기
  • kill [-signal] PID ...
  • 커맨드라인에 지정된 시그널이 없다면, 기본적으로 종료 시그널을 보냄
  • 주요 시그널
    • 1(HUP): 제어 터미널과 연결이 끊어진 프로그램을 가리키는데 사용
    • 2(INT): Interrupt. 터미널에서 CTRL+C 키를 보낸 것과 동일한 기능
    • 9(KILL): 커널이 프로세스를 즉시 종료. KILL 시그널은 마지막 수단으로 사용되어야 함(진행 중 작업 저장할 기회가 없음)
    • 15(TERM): 프로그램이 시그널을 받을 수 있을 정도로 "살아있다면" 프로그램은 이 시그널을 받고 종료됨
    • 18(CONT): STO 시그널로 정지된 프로세스 복원
    • 19(STOP): 프로세스를 종료 없이 일시 정지 시킴
  • kill 명령어로 프로세스에 시그널을 보내려면 반드시 그 프로세스의 소유자이거나 슈퍼유저여야 함
  • 그 외 주요 시그널
    • 3(QUIT): Quit. 사용자가 종료 키를 입력하면 커널이 프로세스에 SIGQUIT 시그널 보냄
    • 11(SEGV): 프로그램이 잘못된 메모리 사용이 이뤄질 때 보내짐
    • 20(TSTP): CTRL+Z를 눌렀을 때 터미널에 의해 보내짐
    • 28 (WINCH): 윈도우 크기가 변경된 경우 시스템에 보내짐
  • killall로 다수의 프로세스에 시그널을 보낼 수도 있음
    • killall [-u user] [-signal] name ...

기타 프로세스 관련 명령어들

  • pstree: 프로세스 간의 부모/자식 관계를 보여주는 트리 형태로 정렬해서 프로세스 목록 출력
  • vmstat: 메모리, 스왑, 디스크 I/O를 포함한 시스템 자원 사용 현황 출력
  • xload: 시간에 따라 시스템 부하를 그래프로 보여주는 그래픽 프로그램
  • tload: xload 프로그램과 유사하지만 터미널에서 그래프 보여줌


'Software Convergence > OS, Linux ' 카테고리의 다른 글

2. System Structure & Program Execution  (0) 2018.09.16
1. Introduction to Operating Systems  (0) 2018.09.16
vimtutor 내용 정리  (0) 2018.09.09
Linux Command Line Guide (1)  (0) 2018.09.06
sudo 명령어 수행 안되는 경우  (0) 2018.07.25

+ Recent posts