[Linux] Shell , Bash, Alias

xub2
|2024. 10. 16. 14:35

필요한 명령어는 ctrl+f 키로 찾으면서 봅시다

셸의 사용

셸이란 사용자와 리눅스 커널 사이에서 중재자 역할을 하는 SW

사용자는 셸을 통해 리눅스를 사용


셸의 기능

명령어 해석기 기능

  • 사용자와 커널 사이에서 명령을 해석하여 전달하는 해석기(interpreter)와 번역기(translator) 기능
  • 또한 셸은 사용자가 입력한 명령이나 파일에서 읽어들인 명령을 해석하고, 적절한 프로그램을 실행한다.
  • 로그인 할 경우 실행되는 셸을 로그인 셸이라고 하고 /etc/passwd 파일에 사용자별로 저장 된다

 

프로그래밍 기능

  • 셸은 자체 프로그래밍 기능이 있어서 프로그램 만들기 가능
  • 여러 명령을 사용하여 반복적으로 수행하는 작업을 하나의 프로그램으로 만들 수 있는데, 이렇게 작성된 프로그램을 쉘 스크립트라고 한다

 

사용자 환경 설정 기능

  • 셸은 사용자 환경을 설정 할 수 있도록 초기화 파일 기능 제공
  • 사용자가 로그인 할 경우, 초기화 파일이 실행되어 사용자 별로 특성에 맞게 추가적인 환경에 세팅 된다

셸의 종류

본셸(sh)

최초의 셸, 현재는 배시 셸 등 다른 셸로 대체

 

C셸(csh)

셸 스크립트 구문 형식이 C언어와 동일

 

콘셸(ksh)

본셸과 호환성이 높으나 초기 설치가 안되어 있기 때문에, 별도 설치 후 사용

 

배시셸(bash)

현재 리눅스의 기본 셸

 

대시셸(dash)

현재 우분투에서 사용되는 셸, 속도가 빠르고 신뢰성이 높다

 

#기본 셸 변경하기
$ chsh [옵션] [사용자명]

출력 명령 - echo , printf

$ echo [문자열]
$ echo linux noJam

$ printf [형식] [인수]
$ printf "%d + %d = %d" 10 10 20


특수문자 출력

#특수 문자 * (와일드카드)
$ ls * -> 현재 디렉토리의 모든 파일과 서브파일을 나열

$ cp * /tmp -> 현재 디렉토리의 모든 파일을 /tmp 디렉토리 아래로 복사한다

$ ls -F t* -> t로 시작하는 파일을 모두 출력하고, 파일 형식에 맞는 특수문자를 뒤에 붙인다

#특수 문자 ? 와 []
# ? 는 길이가 1인 임의의 문자
# [] 는 괄호 안에 포함된 문자중 하나

$ ls t?.txt -> t 다음에 임의의 한 문자가 오고 파일의 확장자가 txt 인 모든 파일의 이름을 출력

# 디렉토리를 나타내는 특수문자 ~ 와 -
# ~는 현재 작업중인 디렉토리
# -는 cd 명령으로 현재 디렉토리로 이동하기 직전에 작업하던 디렉토리

$ cp *.txt ~/ch3 -> 확장자가 txt인 모든 파일을 현재 작업중인 홈 디렉토리 아래 tmp 디렉토리로 복사

$ cd - -> 이전 디렉토리로 이동

# 특수 문자 ; 과 | -> 명령과 명령을 연결
# ; 는 연결된 명령을 왼쪽부터 차례로 실행
# | 는 왼쪽 명령의 실행 결과를 오른쪽의 입력으로 전달

$ date ; ls ; pwd -> 왼쪽 명령어부터 실행, 날짜 파일 목록, 현재 위치 출력

$ ls -al /| more -> 루트 디렉토리에 있는 모든 파일의 상세 정보를 한 화면 씩 출력(숨긴파일 포함)

# ""와 '' 
# "" 는 셸 변수의 값으로 처리
# '' 는 문자열 그대로 출력

$ echo "$SHELL" -> 현재 셸 타입을 알려줌
$ echo '$SHELL' -> $SHELL을 그대로 출력

# `` (백쿼터) 감싸인 문자열을 명령으로 해석
$ echo `date` -> 날짜 및 시간을 출력
$ echo date -> 문자열 date 출력

# \\ (역슬래쉬) 특수 문자 바로 앞에 사용하여 해당 특수문자의 효과를 없애서 일반 문자 취급
$ echo \\$SHELL -> $SHELL을 문자열로 취급하여 출력 

# > , > , >>

$ ls -l > res -> ls -l(긴형식 파일 출력) 결과를 콘솔이 아닌 res 파일에 저장
$ ls -l >> res -> ls -l의 결과를 res 파일의 끝부분에 추가
$ cat < command.txt -> command 파일 안에 있는 명령어를 가져와서 실행


입출력 리다이렉션

셸은 작업중 피요한 파일에 일련번호를 붙여서 관리한다 → 파일 디스크립터

파일 디스크립터 파일 디스크립터 대신 사용하는 이름 정의

0 stdin 명령 표준 입력
1 stdout 명령 표준 출력
2 stderr 명령 표준 오류

 

출력 리다이렉션 : 명령의 결과 화면 출력을 화면이 아닌 파일로 저장

출력 결과를 저장할 파일이 이미 존재하는 경우 >, >> 특수문자 사용

> : 기존 파일의 내용을 삭제하고 결과를 새로 저장

>> : 기존 파일 내용 뒤에 결과를 추가로 이어붙임

 

오류 디라이렉션 :

  • 명령어 실행 과정에서 셸이 화면에 출력하는 메시지는 두개
    • 명령의 정상적인 실행 결과 → 표준 출력
    • 오류 메시지 → 표준 오류 → 표준 오류도 기본적으로 화면으로 출력 되므로 표준 출력처럼 리다이렉션 가능
  • 표준 출력과 표준 오류 모두 기본 장치가 화면으로 지정 되어 있으므로 같은 것 처럼 보이지만 사실 따로 관리 된다
  • 오류 출력을 파일에 저장하는 방법은 아래와 같다
    • 명령 2> 파일명
    # 명령 2> 파일명
    $ ls /abc 2> ls.err
    $ cat ls.err
    
    #표준 출력과 표준 오류 한번에 리다이렉션
    $ ls ./abc > ls.out 2> ls.err ->표준 출력의 내용은 ls.out에 저장, 표준 오류는 ls.err에 저장
    
    # 오류 메시지 버리기 (특수 공간 /dev/null)
    $ ls /abc 2> /dev/null
    

 

따로 관리되는 출력, 오류 리다이렉션?

  • 표준 출력은 ls.out 에 저장 된다.
  • 하지만 오류 메시지는 표준 출력처럼 보이는 것일 뿐, 표준 출력이 아니므로 리다이렉션 X

 

입력 리다이렉션(파일을 불러와 입력으로 사용)

$ cat < command.txt -> command 파일 안에 있는 명령어를 가져와서 실행

Bash 와 Alias

셸 변수 : 현재 셸에서만 사용가능 (지역변수)

환경 변수 : 현재 셸 뿐만 아니라 서브 셸로도 전달되는 변수(전역 변수)

#변수 출력
$ set -> 셸 변수와 환경 변수 모두 출력
$ env -> 환경 변수 출력

#특정 변수 출력
$ echo $옵션

# 셸 변수 정의하기 (띄어쓰기 주의) 변수명+문자열
$ BABO="I am Babo."

# 환경 변수 정의하기 export
$ export BABO

#환경 변수 검색
$ env | grep BABO -> 환경 변수 중 BABO라는 단어가 포함된 변수가 있는지 확인하여 출력

# 환경 변수를 다시 셸 변수로 변경
$ export -n BABO

# 변수 해제
$ unset BABO

Alias 와 History

Alias = 복잡한 명령을 짧은 별명으로 사용

히스토리 = 앞에서 입력한 명령을 다시 불러서 사용

#Alias -> 띄어쓰기 주의

$ alias 이름= ' 명령'
$ alias println='echo'

#Alias 삭제
$ unalias 앨리어스
#History -> 이전 명령어 불러오기

$ history

-> 위 명령어 입력시 이전에 사용한 명령어들이 인덱스와 함께 출력됨

# 명령어 재사용하기
$ !506 -> 예를들어 506번째 명령어가 alias println='echo' 였으면 다시 실행
$ !! -> 바로 이전 명령어 실행