리눅스 SHELL 명령어

박진선·2024년 6월 7일
0

pwd(print working directory)

현재 위치를 확인하는 명령어

mkdir(make directories)

새로운 폴더를 생성하는 명령어, 폴더명과 함께 입력 명령어와 폴더명은 공백으로 구분

ls(list)

폴더나 파일의 목록을 출력하는 명령어

open (macOS)

현재 폴더를 파일 탐색기로 여는 명령어

cd(change directory)

폴더에 진입하는 명령어

touch

새로운 파일을 생성하는 명령어

cat

파일의 내용을 터미널에 출력하는 명령어

rm(remove)

폴더나 파일을 삭제, 옵션 -r(recursive) 폴더를 지우는 옵션, -f(force) 질문을 받지 않고 삭제

mv(move)

폴더나 파일의 위치를 이동하거나, 이름을 변경하는 명령어 예) mv 파일명.txt 이동할 디렉토리, 예) mv 파일명.txt 변경할 파일명.txt 이름 변경

cp(copy)
폴더나 파일을 복사하는 명령어, 예) cp 원본 파일,디렉토리 경로 복사될 경로

cut

cut 명령어는 옵션을 이용하여 입력을 받은 문자열을 잘라내거나 파일에 있는 각 줄의 라인을 잘라내어 새로운 문자열을 출력으로 나타낸다.

cut -d 구분자 -f

sudo(superuser do)

  • 관리자 권한을 획득, 명령어 맨 앞에 붙이면 루트에 상응하는 권한 수준으로 명령어를 수행할 수 있다.

  • /etc/sudoers 파일에 아래와 같은 양식으로 등록된 사용자만 sudo 명령을 사용할 수 있다.
    test ALL=(ALL) ALL
    1 2 3 4

  1. sudo 권한을 부여할 사용자명
  2. 접속 ip address, 설정한 ip 대역에서 접속한 호스트만 가능, ALL은 모든 호스트를 의미
  3. 사용할 계정
  4. 실행 가능한 명령어

실행 시 암호 입력을 생략하려면 'NOPASSWD: ALL '처럼 NOPASSWD 추가 하면 된다.

explorer.exe
윈도우 탐색기를 열어 현재 디렉토리 파일을 찾아 GUI로 보여줌 사용시 공백 + .을 사용
예) explorer.exe .

echo

지정한 문자열 또는 텍스트를 터미널에 출력하는 명령어, 일반적으로 터미널 프롬프트 명령이나 쉘 스크립트, 배치파일에서 화면이나 파일로 상황을 알리는 문자열을 출력할 때 사용 "특수문자" : 특수 문자를 사용 시 또는 긴 문자를 표현할 때 "큰 따옴표"를 사용 예) echo "(abc)"

nano

리눅스 쉘 기반에서 사용할 수 있는 텍스트 편집기 프로그램
nano 파일명.txt : 메모장을 생성 후 내용 편집창이 실행된다.

단축키
Ctrl + O 또는 F3 : 저장
Ctrl + X 또는 F2 : nano 종료 및 저장
Ctrl + W 또는 F6 : 검색
Ctrl + \ : 검색 및 Replace
Ctrl + G : 도움말 실행

chown

파일 또는 디렉토리의 소유자, 소유그룹을 변경하는 명령어

chown [옵션][소유자:소유그룹] [파일 또는 폴더]
예) chown -R tomcat:tomcat apache-tomcat-10.1.23 해당디렉토리 및 하위 경로 모두 소유자 및 소유그룹을 tomcat 으로 변경한다.

옵션
-R : 하위 경로의 소유자를 모두 변경합니다.
-f : 소유자 변경이 안 될때 오류 메시지 표출합니다.
-c : 변경된 파일을 자세히 표출합니다.
-v : 작업상태를 출력합니다.
--help : 도움말을 보여줍니다.
--version : 버전 정보를 보여줍니다.

chmod(change mode)

리눅스에서는 각 파일 및 디렉토리에 대해 읽기(r), 쓰기(w), 실행(x) 권한(permission)을 파일 개별적으로 지정할 수 있도록 만들어 놓았다.

그리고 이 세 가지 권한을 파일을 소유한 사용자(user), 파일을 만든 소유주가 속한 그룹의 사용자(group), 그 외 사용자(others)에 대해 각각 지정할 수 있게 만들었다.

읽기(r), 쓰기(w), 실행(x) 권한 및 소유자(user), 그룹(group), 그 외 사용자(others)에 대한 설정 값을 통틀어 모드(mode)라고 지칭하고 그러므로 chmod 명령을 사용하여 파일의 모드(mode)를 변경한다.

폴더나 파일의 읽기, 쓰기, 실행 권한을 변경, OS에 로그인한 사용자와, 폴더나 파일의 소유자가 같을 경우 chmod로 변경 가능

OS에 로그인한 사용자와, 폴더나 파일의 소유자가 다를 경우 sudo를 이용해 변경

읽기권한 r(4)

파일 : 파일 읽기, 열기를 허용한다.

디렉토리 : 디렉토리 내의 파일을 ls 명령어 등으로 읽을 수 있게 허용한다.

쓰기권한 w(2)

파일 : 파일에 쓰기, 잘라내기를 허용한다.
이름 변경이나 파일 삭제를 허용하지 않고 파일 삭제나 파일 이름 변경은 디렉토리 속성에 의해 결정된다.

디렉토리 : 디렉토리 내의 파일들을 생성, 삭제, 이름변경이 가능하도록 허용한다.

실행권한 x(1)

파일 : 파일이 프로그램으로 처리되고 파일이 실행되도록 허용한다.
스크립트 언어에서 작성된 프로그램 파일들은 읽기 가능으로 설정 되어 있어야만 실행 가능하다.

디렉토리 : 디렉토리 내에서 탐색을 위해 이동 할 수 있도록 허용한다. (cd 명령어를 통해 디렉토리에 들어 올 수 있도록 허용)

권한 변경 첫번째 더하기(+), 빼기(-), 할당(=)과 액세서(accessor) 유형을 표기해서 변경하는 Symbolic method

Access class	Operator				Access Type
u (user)		+ (add access)			r (read)
g (group)		- (remove access)		w (write)
o (other)		= (set exact access)	x (execute)
a (all: u, g, o)	

사용방법
chmod [OPTION][MODE] [FILE]
OPTION
-v : 모든 파일에 대해 모드가 적용되는 진단(diagnostic) 메시지 출력.
-f : 에러 메시지 출력하지 않음.
-c : 기존 파일 모드가 변경되는 경우만 진단(diagnostic) 메시지 출력.
-R : 지정한 모드를 파일과 디렉토리에 대해 재귀적으로(recursively) 적용, 하위 디렉토리까지 모두 일괄 적용
MODE
파일에 적용할 모드(mode) 문자열 조합.
u,g,o,a : 소유자(u), 그룹(g), 그 외 사용자(o), 모든 사용자(a) 지정.
+,-,= : 현재 모드에 권한 추가(+), 현재 모드에서 권한 제거(-), 현재 모드로 권한 지정(=)
r,w,x : 읽기 권한(r), 쓰기 권한(w), 실행 권한(x)
X : "디렉토리" 또는 "실행 권한(x)이 있는 파일"에 실행 권한(x) 적용.
s : 실행 시 사용자 또는 그룹 ID 지정(s). "setuid", "setgid".
t : 공유모드에서의 제한된 삭제 플래그를 나타내는 sticky(t) bit.
0~7 : 8진수(octet) 형식 모드 설정 값.

예) chmod u+x 파일명 : 해당 파일에 유저는 실행이 가능하게 권한 추가

두 번째는 rwx를 3 bit로 해석하여, 숫자 3자리로 권한을 표기해서 변경하는 Absolute form
Read(r) : 4, Write(w) : 2, Execute(x) : 1 예) chmod 744 파일명 : user는 rwx 모두 가능, 그룹과 다른유저는 쓰기 실행만 가능

head : 파일의 내용을 text기반으로 출력
head -n 100 파일명 : 처음부터 100행 까지 내용 출력 -n은 생략 가능

apt(Advanced Packaging Tool)패키지 매니저
⦁ apt 와 apt-get 차이점
apt는 보기좋은 진행률 표시
apt는 업그레이드해야 하는 패키지 목록 나열
apt는 apt-get, apt-cache 및 dpkg -l의 기능을 결합하여 나온 새로운 명령어

⦁ apt update: 패키지의 업데이트 여부 확인(관리자 권한 필요), 패키지를 다운로드할 수 있는 여러 저장소의 최신 정보를 업데이트

⦁ apt list --upgradable: 업데이트 필요한 파일 조회

⦁ apt upgrade: 프로그램 업그레이드

⦁ apt show: 프로그램의 정보 확인

⦁ apt install: 프로그램 설치

⦁ apt list --installed: 설치된 프로그램 목록 보기

⦁ apt remove: 프로그램 삭제

⦁ apt search : 패키지 검색

⦁ Read, Write, Execute 권한
ls -l 실행해 보면 파일의 권한을 표현하는 부분이 출력되는데 -rw-rw-r-- 이와 같을 경우 첫번째 자리의 경우 디렉토리일 경우 d, 파일이면 - 를 뜻하고
나머지는 3자리씩 묶어서 첫번째는 owner 를 의미하며 권한은 rw- 읽기 쓰기 가능 실행은 불가, 2번째 group -rw 읽기 쓰기 가능 실행은 불가
3번째 other r-- 읽기 가능 쓰기 실행 불가

wget

⦁ 웹 서버로부터 콘텐츠를 가져오는 컴퓨터 프로그램으로, GNU 프로젝트의 일부이다.
이 프로그램의 이름은 월드 와이드 웹과 get에서 합쳐진 Wget이다. Wget은 HTTP, HTTPS, FTP 프로토콜을 통해 내려받기를 지원한다.

⦁ apt install wget : wget 설치 방법

◉ 키워드
⦁ / : 루트 디렉토리, 리눅스 파일 체제의 최상의 디렉토리로 모든 디렉토리들의 시작점을 나타냄, 절대경로로 경로를 표기할 때 최상위 루트(/)부터 시작

⦁ ~ : 홈 디렉토리, 계정명으로 설정된 폴더를 말하며 보통 리눅스에 처음 로그인하면 접속되는 위치를 말함

⦁ . : 닷 디렉토리, 상대 경로의 시작이 현재 디렉토리인 것을 나타냄

⦁ .. : 현재 폴더보다 앞에 있는 폴더를 가리킴. 예) mv 파일명.txt ../../ 현재 디렉토리에 있는 txt파일을 상위 상위 폴더로 이동시킴

⦁ - : 특정 명령어의 옵션을 사용할 때 이용 예) ls -l

⦁ > : 실행 결과를 파일로 저장함 예) ls > 파일명.txt

⦁ >> : 실행 결과를 파일로 저장할 때 파일명이 존재할 경우 해당 파일에 이어쓰기함 예) ls >> 파일명.txt 해당 파일명이 존재할 경우 기존 파일에 내용을 덧붙임

⦁ \ : 역슬래쉬, 이스케이프 문자 공백이나 특수문자가 있을경우 적용해서 사용 예) mkdir hello\ world

vi

⦁ 편집기 명령어, 명령모드, 입력모드, 마지막 행모드로 구성되어 있다.

⦁ 1. 명령 모드 (Command mode)
vi 명령어로 편집기를 시작할 시, 단축키를 사용하여 커서의 이동, 수정, 삭제, 복사 & 붙이기 등 다양한 명령을 수행할 수 있다.
입력모드에 진입한 후, 다시 명령모드로 돌아오려면 [ESC]키를 누르면 명령모드로 다시 되돌아올 수 있다.

  1. 입력 모드 (Insert mode)
    명령모드 상태에서 i, a, o, I, A, O 의 단축키를 입력하여 입력모드로 전환할 수 있다. 입력모드에서는 직접 글이나 코드를 작성할 수 있는 상태이다.
    i 현재 커서 위치에 입력모드 진입
  1. 마지막 행 모드 (Last line mode)
    마지막 행 모드는 명령모드 상태일 때, ':' (콜론)을 입력하면 화면 맽 밑에서 명령을 수행하는 모드이다.저장, 종료, 치환, 탐색 등의 기능을 수행할 수 있다.
    :w 파일 저장
    :q! vi 강제 종료
    :wq 저장 후 종료

⦁ 문자열 찾기
/찾을문자열 입력 후 엔터를 누른다. n을 누를 경우 일치하는 다음 문자열로 이동, N을 누를 경우 일치하는 이전 문자열로 이동한다.

nohup(no hang up)

⦁ 일반적인 리눅스 프로세스는 SSH 세션이 종료될 경우 백그라운드 여부와 관계 없이 종료된다. nohup을 사용할 경우 ssh 세션이 종료되더라도 삭제되지 않도록할 수 있다.

⦁ 실행을 현재 사용자 세션이 아닌 운영체제가 제공하는 백그라운드 공간에서 실행을 한다. 리눅스는 기본적으로 exit로 세션을 종료할 경우 터미널과 연결이 끊어졌다는 HUP(Hang Up,끊다) 시그널이 발생하고
자식 프로세스들은 STOP 시그널을 받게 된다.
이 때, nohup 명령은 “세션이 종료되더라도 계속 실행하게 하고 싶은 프로세스에는 HUP 시그널을 전달하지 않도록(No Hang Up,끊지마) 한다"는 의미이다.

⦁ nohup는 프로그램을 데몬으로 형태로 실행시키는 것이기에 로그아웃 등과 같이 세션 연결이 끊기더라도 프로세스가 계속 동작된다. 그러나, 실행 시키면 대기 상태가 발생하고 Ctrl+C를 누르면 프로세스는 바로 종료된다.
그에 비해, 백그라운드(&) 실행은 실행 시키면 대기 상태가 없지만, 세션 연결이 끊기면 실행한 프로그램도 함께 종료된다.

명령어 예시

nohup 실행 파일명
nohup 실행 파일명 & : 백그라운드로 실행

ps(Process Status)

⦁ 현재 실행 중인 프로세스와 상태를 출력하는 명령어 이다.

⦁ PID 조회 방법
ps : shell 에서 실행중인 프로세스만 출력
ps -e : 실행중인 모든 프로세스 출력
ps -f : shell 에서 실행중인 프로세스의 모든 상태정보를 출력
ps -ef | grep 찾을 파일명 : 특정 프로세스의 PID 확인

⦁ 명령어 출력 항목
UID(User ID) : 해당 프로세스를 실행한 사용자의 정보를 나타냄

PID(Process ID) : 운영체제에서 프로세스를 구분하기 위해서 부여받은 번호, 최대값은 32768 이다. 16bit signed integer 를 사용하기 때문
할당 방식은 최근 할당된 PID 에 1을 더한 값으로 할당한다. 순서대로 1씩 할당되다가 32768 을 넘어가면 다시 1부터 시작한다.

PPID(Parent Process ID) : 해당 프로세스를 만든 부모 프로세스의 PID를 의미한다. 부모 프로세스는 현재 실행 중인 프로세스 (자식 프로세스) 를 시스템 콜을 호출하여 생성한 프로세스를 의미한다.
부모 프로세스가 자식 프로세스보다 일찍 종료되는 경우 자식 프로세스는 고아 프로세스가 되어 PPID 로 init process 의 PID, 1을 가지게 된다.
init 프로세스는 PID 1 을 가지는 최초 프로세스이다. 부팅 시 운영체제가 생성하는 프로세스이다.

GID(Group ID) : 리눅스에서는 사용자를 그룹으로 묶을 수 있는데 이 그룹을 구분지을 수 있는 ID

SID(Session ID) : 세션(Session)은 여러 프로세스의 묶음을 의미한다. SID는 이런 세션을 식별하기위해서 부여되는 번호를 의미한다.

pgrep(process)

⦁ ps 명령어와 grep 명령어를 합쳐서 하나의 명령어로 사용해서 원하는 정보를 편하게 출력하는 명령어
pgrep [OPTIONS] 구조로 사용한다.

⦁ 옵션
옵션 없이 패턴만 지정할 경우 지정한 패턴과 프로세스의 이름이 매칭되는 프로세스의 PID를 출력한다.
-c : 조건에 맞는 프로세스 수를 출력한다. 예) pgrep -c vi
-d : PID를 구분하는 문자열을 설정한다. 예) pgrep -d :(구분문자열) vi
-l :
-f :

netstat

⦁ 옵션
-l 옵션 : netstat에 모든 수신 소켓을 표시한다.
-t 옵션 : 모든 TCP 연결을 표시한다.
-u 옵션 : 모든 UDP 연결을 표시한다.
-p 옵션 : 포트에서 수신하는 어플리케이션/데몬의 이름을 표시한다.
-n 옵션 : 서비스 이름 대신 port 번호를 표시한다.

⦁ 특정 포트의 PID 확인
netstat -tulpn | grep 포트번호

환경변수 설정방법

⦁ 지역 환경변수를 적용할 경우 ~/.bash_profile를 편집, 전역 환경변수를 적용할 경우 /etc/profile를 편집 한다.
⦁ 1. vi /etc/profile 명령어를 사용해 편집에 들어간 다음 최하단에 export 환경변수명=경로 를 작성하고 저장한 뒤 편집툴을 종료한다.
2. source ~/.bash_profile 또는 source /etc/profile를 입력해 변경 내용을 적용한다.

◉ source
⦁ source /경로

⦁ 스크립트 파일을 수정한 후에 수정된 값을 바로 적용하기 위해 사용하는 명령어이다.
예를들어 /etc/bashrc 파일을 수정 후 저장하여도 수정한 내용이 바로 적용되지 않는다.
왜냐하면 /etc/bashrc 파일은 유저가 로그인할 때 읽어들이는 파일이여서, 로그아웃 후 로그인하거나 리눅스를 재시작해야 적용이 된다.
이럴경우 간단하게 # source /etc/bashrc 명령어로 수정된 내용을 바로 적용할 수 있다.

◉ curl
⦁ 윈도우 환경에서 명령어 사용시 싱글쿼터 사용시 에러가 발생함 문자열 내에 따옴표를 사용하기 위해 이스케이프문자 \ 사용

변경전 : curl -X POST http://localhost:8080/members -H "Content-Type: application/json" -d '{"name":"park"}'
변경후 : curl -X POST http://localhost:8080/members -H "Content-Type: application/json" -d "{\"name\":\"park\"}"

사용자

모든 사용자 조회
cat /etc/passwd

출력 정보
예) john:x:1001:1001:John Doe:/home/john:/bin/bash
사용자명:비밀번호:사용자ID:그룹ID:사용자정보:홈디렉토리경로:로그인쉘

사용자 생성
useradd [옵션][사용자명]

옵션설명
-d, --home 홈디렉터리 지정.
-D, --default 사용자 생성시 사용하는 기본값을 보거나 설정
-e, --expiredate YYYY-MM-DD 형식으로 계정의 만기일 지정
-f. --inactive 패스워드 만료일 이후 유효기간을 설정1이상의 숫자이면 해당일수만큼 패스워드 유효.0이면 만료되면 바로 잠김.-1이면 해당기능을 사용하지 않음.
-g, --gid GROUP 사용자 그룹설정.설정하지 않으면 사용자 이름과 동일한 그룹에 설정.
-G, --groups 기본 그룹이외에 추가로 그룹을 생성할때
-k, --skel SKEL_DIR -m옵션을 통해 홈 디렉터리 생성할때 복사할 기본파일을 지정할때 사용
-m, --create-home 홈 디렉터리를 지정할 떄 사용하고 디렉터리가 없으면 생성-k 옵션과 같이 사용해서 홈디렉터리 생성시 복사할 기본 파일경로도 지정
-M 홈디렉터리를 생성하지 않음
-N, --no-user-group 사용자와 동일한 이름으로 그룹을 생성하지 않음.
-p, --password 평문이 아닌 암호화된 패스워드를 설정
-r, --system 시스템 계정을 생성
-s, --shell 사용자가 사용할 셸을 지정
-u, --uid 사용자 유일한 UID값 설정

사용자 그룹

  • 다중 사용자를 편하게 관리하기 위해 사용자 그룹이 존재한다.

  • 권한을 통해 특정 그룹에 소속된 사용자만 파일에 접근할 수 있게 할 수 있다.

  • 모든 계정은 반드시 하나 이상의 그룹에 속해있다.
    계정을 생성할 때 소속 그룹을 명시하거나 생략할 경우 사용자 이름과 동일한 이름의 그룹이 생성되어 소속된다.

  • Primary Group과 Secondary Groups으로 나뉜다.
    Primary Group은 사용자가 반드시 가지는 하나의 그룹인데 사용자가 파일 또는 디렉토리를 생성할 경우 해당 사용자와 그 사용자가 속한 Primary Group이 해당 파일의 소유자, 소유 그룹이 된다.
    사용자는 여러 그룹에 소속될 수 있는데 Primary Group을 제외한 나머지가 Secondary Group 이다. 사용자가 파일이나 디렉토리에 접근할 때 해당 파일의 소유자또는 소유자 그룹의 그룹원인지 판단하는데 사용자가 아니더라도 그룹원일 경우 접근이 가능하다.

그룹 조회 방법

groups 사용자명 : 특정 사용자가 속한 그룹 목록 출력, 특정 사용자 생략 시 현재 사용자가 속한 그룹 목록 출력

/etc/group 파일에 접근하여 모든 그룹 확인 가능하다.
출력 양식
그룹명:비밀번호:그룹id:그룹에 속한 사용자명
그룹에 속한 사용자명이 생략된 경우는 특정 사용자 생성시 생성된 기본그룹에 어떠한 사용자도 추가되지 않았을 경우에는 생략된다.

gpasswd -a 사용자명 그룹명, 그룹에 사용자를 추가

옵션
-a user : 특정 그룹에 새로운 그룹멤버를 추가함.
-d user : 특정 그룹에서 지정한 그룹멤버를 제거함.
-r : 특정 그룹의 패스워드를 제거함
-R : 특정 그룹에 접근을 제한함
-A user, ... : 특정 그룹의 그룹관리자를 설정함
-M user, ... : 특정 그룹의 그룹멤버를 새로 설정함.
위의 옵션들 가운데 -A 와 -M 외의 옵션들은 동시사용이 가능하다

◉ 환경변수
⦁ printenv : 환경변수 목록 출력
⦁ echo $환경변수 : 특정 환경변수 값 출력

⦁ PATH 환경변수의 경우 각 경로가 :(콜론)으로 구별되어 있다.

◉ 프로세스 종료
⦁ kill -9 PID
⦁ pkill 프로세스명

◉ 프로세스 확인 명령어

◉ log확인 명령어
⦁ tail -옵션 파일명
옵션
-f : tail을 종료하지 않고 파일의 업데이트 내용을 실시간으로 계속 출력한다.
-n (라인 수) : 파일의 마지막줄부터 지정한 라인수까지의 내용을 출력한다.
-c (바이트 수) : 파일의 마지막부터 지정한 바이트만큼의 내용을 출력한다.
-q : 파일의 헤더와 상단의 파일 이름을 출력하지 않고 내용만 출력한다.
-v : 출력하기전에 파일의 헤더와 이름 먼저 출력한 후 파일의 내용을 출력한다.

파일 디스크립터

  • Unix OS에서 네트워크 소켓과 같은 파일이나 기타 입력/출력 리소스에 액세스하는 데 사용되는 추상표현이다. 0번에서 2번까지는 고정되어 있다.
    파일 디스크립터가 단순히 숫자인 이유는 프로세스가 유지하고 있는 file descriptors 테이블의 인덱스이기 때문이다.
    결국 파일 디스크립터란 시스템이 만들어 놓은 것을 가리키기 좋게 하기 위해 시스템이 우리들에게 건네주는 숫자에 지나지 않는다.

  • 표준입력(Standard Input) 0번
    쉘의 표준 입력을 의미하며 표준 입력은 키보드 이다. 쉘은 키보드 입력을 STDIN 파일 디스크립터로부터 받으면 입력하는 각 문자들을 처리한다.
    입력 리다이렉트(<)와 STDIN을 사용하면 리눅스는 표준 입력 파일 디스크립터를 리다이렉트가 가리키는 파일로 바꾼다.
    표준 입출력이었던 키보드로부터 입력을 받는 것이 아니라 파일을 읽어드림으로써 입력을 받는다.

  • 표준 출력(Standard Output) 1번
    쉘의 표준 출력을 의미하며 표준 출력은 터미널 모니터 이다. 출력 리다이렉트(>)를 사용함으로써, 출력 대상을 변경할 수 있다. ex) 모니터로 출력되어야 할 출력물을 파일로 저장

  • 표준에러(Standard Error) 2번
    쉘은 입출력과 별개로 오류 메시지를 처리한다.
    STDERR 파일 디스크립터: 쉘 또는 쉘에서 실행되는 프로그램이 만들어낸 오류 메시지를 보내는 장소
    STDERR 파일 디스크립터는 기본적으로 STDOUT 파일 디스크립터와 같은 곳 (모니터)를 가리킨다.

리다이렉션

리다이렉션(입출력 재지정)이란 일반적인 키보드 입력, 화면 출력을 사용하지 않고 사용자 마음대로 입력, 출력을 재지정 하겠다는 말이다.
본래 표준입력은 기본적으로 키보드에서 직접 받아오고, 표준 출력은 기본적으로 따로 디스크에 저장하지 않고 화면에 출력된다.
이러한 입출력들을 [파일]에서 직접 입력을 받아오고 직접 출력(파일에 저장)한다.
대표적으로 키보드에서 입력을 받지않고 파일내용을 입력으로 받거나, 내용을 화면에 출력하지않고 파일에 저장하는 것이 있다.

명령 > 파일 (파일 쓰기)
명령어에 의해 출력된 결과물을 지정한 파일로 덮어쓰기 한다.

명령 >> 파일 (파일 쓰기)
명령어에 의해 출력된 결과물을 지정한 파일에 덧붙인다.

명령 < 파일 (파일 읽기)
파일의 데이터를 명령에 입력

리다이렉션 연산 조합

명령 >& 파일명 : 명령이 실행된 표준 출력의 결과와 에러를 파일로 출력
명령 >>& 파일명 : 명령이 실행된 표준 출력의 결과와 에러를 파일로 덧붙여 출력
명령 >! 파일명 : 파일의 존재 유무와 상관없이 생성하고 명령이 실행된 표준 출력의 결과를 파일로 출력
명령 >&! 파일명 : 파일의 존재 유무와 상관없이 생성하고 명령이 실행된 표준 출력의 결과와 에러를 파일로 출력
명령 >>! 파일명 : 파일의 존재 유무와 상관없이 생성하고 파일에 덧붙여 출력
명령 >>&! 파일명 : 파일의 존재 유무와 상관없이 생성하고 명령이 실행된 표준 출력의 결과와 에러를 파일에 덧붙여 출력

명령 > 파일명 2>&1
& 기호는 숫자 1을 표준 출력 일련번호로 인식하게 해주는 설정이다. &기호를 사용하지 않으면 1이라는 파일로 인식된다. 즉 표준 에러를 1 이라는 파일에 저장하게 된다.
표준 출력을 지정한 파일명으로 파일을 생성하여 저장하고, 표준 에러 출력을 표준 출력 동작으로 행한다는 의미이다.

nohup java -jar -Dspring.profiles.active=dev review-api.war > /dev/null 2>&1 &

1> /dev/null : 표준 출력(1)의 결과를 /dev/null(버림)로 전달
2>&1 : 표준 에러(2)를 표준 출력(1)이 전달되는 곳(/dev/null)으로 동일하게 전달

◉ 파이프
program1의 표준 출력을 program2의 표준입력으로 입력받는 것이다. 즉, 명령어의 결과를 다시 어떤 명령어의 입력으로 받아야 할때 사용된다. 
| 기호 앞의 명령 결과가 뒤의 명령에 입력 데이터로 사용

ls -l | grep zip : # ls -l 명령의 표준 출력 중에서 zip이라는 문자열을 포함한 것만 확인하는 연속 명령

cat /etc/passwd | grep "root" : /etc/passwd의 내용이 grep의 입력값으로 받아 root를 필터링

ll | grep "^d" | wc -l : ll로 디렉토리 파일들을 출력하고, 그 출력 내용을 d로 시작되는 파일만 필터링하고, 필터링 된 내용의 개수를 출력

◉ tar(Tape ARchiver)
⦁ 아카이버(Archiver)는 통상적으로 여러 개의 파일을 하나의 파일로 합치는 프로그램을 의미한다.
저장 장치에 파일을 저장하거나 네트워크를 통해 파일을 전송할 때 파일이 여러 개 있으면 관리가 복잡해지기 때문에, 여러 파일을 하나로 합쳐서 처리하기 위한 목적으로 만들어진 프로그램이다.

⦁ tar [OPTION...][FILE]...
-f : 대상 tar 아카이브 지정. (기본 옵션)
-c : tar 아카이브 생성. 기존 아카이브 덮어 쓰기. (파일 묶을 때 사용)
-x : tar 아카이브에서 파일 추출. (파일 풀 때 사용)
-v : 처리되는 과정(파일 정보)을 자세하게 나열.
-z : gzip 압축 적용 옵션.
-j : bzip2 압축 적용 옵션.
-t : tar 아카이브에 포함된 내용 확인.
-C : 대상 디렉토리 경로 지정.
-A : 지정된 파일을 tar 아카이브에 추가.
-d : tar 아카이브와 파일 시스템 간 차이점 검색.
-r : tar 아카이브의 마지막에 파일들 추가.
-u : tar 아카이브의 마지막에 파일들 추가.
-k : tar 아카이브 추출 시, 기존 파일 유지.
-U : tar 아카이브 추출 전, 기존 파일 삭제.
-w : 모든 진행 과정에 대해 확인 요청. (interactive)
-e : 첫 번째 에러 발생 시 중지.

◉ basename
⦁ 파일명이나 확장자를 추출할 수 있으며 파일 경로를 옵션없이 사용하면 확장자를 포함한 파일명을 추출한다.

⦁ basename 경로명

systemctl

systemd(system daemon) 을 관리하는 명령어 이다.

systemctl start 서비스명 : 서비스 시작

systemctl status 서비스명 : 서비스의 상태를 확인한다.

systemctl enable 서비스명 : 부팅 시 자동 시작된다.

쉘 스크립트 문법

변수

  • 변수의 타입에는 로컬변수와 전역변수, 환경변수, 예약변수, 매개변수 등 다양히이 존재한다.

  • 변수는 대, 소문자를 구별한다.

  • 변수의 이름은 숫자를 포함할 수 있지만, 숫자로 시작할 수 없다.

  • 변수에는 모든 값을 문자열로 저장된다.

  • 변수에는 자료형을 기입하지 않는다. (int number, char names[10]), 즉 아무런 값을 다 넣을 수 있다.

  • 값을 사용할 때는 변수명 앞에 특수문자 "$"를 사용한다. 예) echo ${data}

  • 값을 대입(삽입)할 때는 특수문자 "$"를 사용하지 않는다. 예) data=mac

  • 변수를 생성할 때는 "=" 대입문자 앞뒤로 공백이 없어야 한다. 예) data="abcd"

  • 쉘에서 선언된 변수는 기본적으로 전역 변수이다. 단 함수 안에서만 지역변수를 사용할 수 있는데 변수명 앞에 local을 붙여주면된다. 예) fuction test(){local var="test"}

  • 문자열 안에 붙여서 쓸려면 변수명를사용해야한다.)"test{변수명} 를 사용해야 한다. 예) "test{변수명}"

매개변수
스크립트 실행시 ./스크립트명 인자값1 인자값2 형태로 인자값을 전달한다.
스크립트 내에서 매개변수로 받은 값을 아래 키워드를 통해 사용이 가능하다.
$0 : 현재 쉘 스크립트의 이름
$# : 위치 매개변수의 총 개수
$ : 모든 위치 매개변수
$@ : 큰 따옴표를 사용하였을 때를 제외하고는 $
와 동일한 의미
$1 ... ${10} : 스크립트에 넘겨진 각 번째 아규먼트

환경변수(environment variable)
변수명 앞에 export 키워드를 붙여주면 환경 변수로 설정되어 하위 스크립트에서 변수 사용이 가능하다. (선언된 변수는 같은 디렉토리내에 다른 스크립트에서도 사용 가능하다는데 테스트시 안됨)
예) 스크립트a.sh 에서 export test="test" 선언 후 b.sh 를 호출하고 b.sh 에서는 echo $test 를 작성하여 test 변수의 값이 출력된다. 이와 같이 호출한 하위스크립트에서 상위 스크립트 변수 사용이 가능하다.

예약 변수
쉘 스크립트에서 사용자가 정해서 만들 수 없는 이미 정의된 변수가 존재한다. 이 변수명을 피해서 스크립트를 작성해야 한다.
HOME : 사용자 홈 디렉토리
PATH : 실행 파일의 경로여러분이 chmod, mkdir 등의 명령어들은 /bin이나 /usr/bin, /sbin에 위치하는데, 이 경로들을 PATH 지정하면 여러분들은 굳이 /bin/chmod를 입력하지 않고, chmod 입력만 해주면 된다.
LANG : 프로그램 실행 시 지원되는 언어
UID : 사용자의 UID
SHELL : 사용자가 로그인시 실행되는 쉘
USER : 사용자의 계정 이름
FUNCNAME : 현재 실행되고 있는 함수 이름
TERM : 로그인 터미널

조건문
여타 언어와 달리 중괄호를 안쓰기 떄문에 fi로 if문의 끝을 알려주어야 한다. if문 뒤에 나오는 대괄호 [ ] 와 조건식 사이에는 반드시 공백이 존재해야 한다.
if [ 값1 조건식 값2 ]
then
수행1
else
수행2
fi

가독성을 위해 아래와 같이 사용가능, if[]뒤에 ; 세미콜론 필수
if [ 값1 조건식 값2 ]; then
수행1
else
수행2
fi

if문에 사용되는 조건식

비교연산
문자1 = 문자2 문자1 과 문자2가 일치 (sql같이 = 하나만 써도 일치로 인식)
문자1 == 문자2 문자1 과 문자2가 일치
문자1 != 문자2 문자1 과 문자2가 일치하지 않음
-z 문자 문자가 null 이면 참
-n 문자 문자가 null 이 아니면 참
문자 == 패턴 문자열이 패턴과 일치
문자 != 패턴 문자열이 패턴과 일치하지 않음
값1 -eq 값2 이 같음(equal)
값1 -ne 값2 값이 같지 않음(not equal)
값1 -lt 값2 값1이 값2보다 작음(less than)
값1 -le 값2 값1이 값2보다 작거나 같음(less or equal)
값1 -gt 값2 값1이 값2보다 큼(greater than)
값1 -ge 값2 값1이 값2보다 크거나 같음(greater or equal)

파일검사
-d : 파일이 디렉토리면 참
-e : 파일이 있으면 참
-L : 파일이 심볼릭 링크면 참
-r : 파일이 읽기 가능하면 참
-s : 파일의 크기가 0 보다 크면 참
-w : 파일이 쓰기 가능하면 참
-x : 파일이 실행 가능하면 참
파일1 -nt 파일2 : 파일1이 파일2보다 최신파일이면 참
파일1 -ot 파일2 : 파일1이 파일2보다 이전파일이면 참
파일1 -ef 파일2 : 파일1이 파일2랑 같은 파일이면 참

case 문
문자1* : 문자1 뒤에 어떠한 문자가 0개 또는 여러개가 오더라도 일치한다.
? : 임의의 문자 하나를 의미한다.
[문자1문자2] : or의 의미 문자1 또는 문자2가 오면 일치

  • : 와일드카드가 하나만 쓰이면 default의 의미 조건들이 전부 일치하지 않을 경우 실행

case 문자열 in
경우1)
명령 명령 명령
;;
경우2)
명령 명령 명령
;;

  • )
    명령 명령 명령
    ;;
    esac

함수
함수명 앞 function은 써주지 않아도 알아서 인식된다. 또한, 함수를 호출할때는 괄호를 써주지 않고 호출해야한다.
함수 호출 코드는 함수선언부 보다 반드시 아래에 있어야 한다.

명령어 치환(command substitution)
명령어의 실행 결과를 다른 명령어의 입력으로 사용하는 것 이다. 명령어의 결과를 변수에 저장하거나, 다른 명령어의 인자로 전달할 수 있다.
백틱과 명령어열 또는 $(명령어열) 형태로 사용할 수 있다. 사용시 실행 결과(표준 출력)을 문자열로 치환할 수 있다.

사용예시
file_count=$(ls | wc -l) 명령어 결과값을 변수에 대입
echo "Kernel is $(uname -r)" 문자열 처리에 사용

profile
주니어 개발자 입니다

0개의 댓글