Shell Special Characters (Metacharacters) - 자주쓰는 쉘 특수문자/메타문자 정리

가영·2020년 12월 9일
0
post-thumbnail

Shell Special Characters (쉘 특수기호)란?

Shell 특수기호는 Shell 메타문자로 불리기도 한다. 쉘은 이런 특수기호들을 해석(interpret)하여 명령을 실행한다. 그래서 쉘 메타문자를 잘 알아두고 일반 문자와 같이 사용하지 않도록 조심할 필요가 있다. 익숙한 정도까지 메타문자를 잘 익히고 활용하면 쉘 조작의 효율을 높일 수도 있을 것이다.😉


1. File Name Extension

파일 이름을 확장하는 데 사용되는 메타문자들이다.

메타 문자의미
*문자열 wildcard
?문자 1개 wildcard
[ ]문자 집합 wildcard
{ }문자열 집합 (comma로 분리)
  • wildcard : 임의의 문자와 매칭할 수 있는 문자

    • ? : 문자 한 개와 매칭
    • * : 임의의 길이의 문자열과 매칭 (NULL 문자 포함)
    • [ set ] : set의 문자 중의 하나와 매칭된다
    • [ !set ] 또는 [ ^set ] : set에 없는 문자 중의 하나와 매칭된다
  • expansion , { } : 제시된 문자열로 대체
$ ls -l /a/b/{c.h,d.h} # ls -l /a/b/c.h /a/b/d.h 로 확장

예시로 더 자세히 살펴 보자.


예시 - wildcard *

  1. a.c, a.txt, a.o가 있을 때 ?를 사용하면...

    표현 방식결과
    a.?a.c a.o
  2. bob, darlene, dave, ed, frank, fred 가 있을 때 *를 사용하면...

    표현 방식결과
    fr*frank fred
    *eded fred
    b*bob
    *e*darlene dave ed fred
    *r*darlene frank fred
    *bob darlene dave ed frank fred
    d*ddarlene dave
    g*

예시 - set[]

중괄호가 집합이 되는 것이다. 중괄호 안에 있는 원소는 집합이 될 수도 있다.

표현 방식매칭되는 문자
[abc]a, b, 또는 c
[.,;]period, comma, 또는 semicolon
[-_]dash 또는 underscore
[a-c]a, b, 또는 c
[a-z]a에서 z까지 알파벳 소문자
[!0-9]숫자가 아닌 모든 문자
[0-9!]숫자와 느낌표
[a-zA-Z]모든 알파벳 문자
[a-zA-Z0-9_-]모든 알파벳, 숫자, underscore, dash

예시 - 괄호 확장(Expansion) {}

괄호 확장은, 우리가 줄여놓은 걸 쉘이 풀어서 써놓는다고 생각하면 쉽다.

표현 방식결과
b{ed,olt,ar}sbeds bolts bars
b{ar{d,n,k},ed}sbards barns barks beds
  • Wildcard와 비교 하기

    a1.c, a2.c, a3.c 가 있을 때

    표현 방식결과
    a{1,2,3,4}.ca1.c a2.c a3.c a4.c
    a[1234].ca1.c a2.c a3.c
    a?.ca1.c a2.c a3.c
    *.ca1.c a2.c a3.c

2. Command Substitution

커맨드 대치는 back-quote (``) 안의 문자열을 명령어로 실행한다.

그리고 그 명령의 결과로 substitute 한다. 말로하니까 이해가 어렵다. 예시를 보자.

$ cat receiver
ewha ewha10 ewha100 # cat receiver의 표준출력값

$ mail `cat receiver` # 아래와 동일한 의미
$ mail ewha1 ewha10 ewha100

위의 두 개의 mail 명령줄을 보면, 쉘은 백쿼터안의 string을 명령으로 수행하여 cat receiver의 출력값으로 interpret 함을 알 수 있다.

$ d=`date` # 변수 선언, date 명령어의 표준출력값이 d라는 변수에 대입됨
$ echo $d # d의 value를 화면에 출력함
2020. 12. 10. () 02:15:29 KST

여기도 마찬가지로 백쿼트로 date를 감싼 것이 date 커맨드의 실행 결과로 interpret되어 d에 저장되는 것을 알 수 있다.


3. Escape character

이스케이프 문자는 쉘이 해석하는 것을 원하지 않을 때 사용하는 것이다. 우리가 입력한 그대로의 문자열이 명령의 인자로 들어가게끔!

메타문자의미
\ Single character escape
' 'String escape (String을 그대로 자식 process에 전달)
" "String escape ($와 `를 expand하고 자식 process에 전달)

1) Escape a single char ( \ : back slash)

$ echo *              # ls와 같은 결과
a.c text1 directory1 

$ echo \*             # *을 그대로 표준 출력으로 보냄
*
$ echo hi > file   # file에 표준 입력을 쓰기
$ cat file         # file 보기
hi

$ echo hi \> file  # 표준 출력에 'hi > file' 보내기
hi > file

2) Escape string (' ' : single quote)

$ echo 'this part is not for shell'
this part is not for shell

3) Escape string (" " : double quote)

$ echo "this part not for shell except $PATH"
this part not for shell except /home/202CS133/bin:/home/202CS133/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

$ echo "Today is `date`"
Today is 2020. 12. 10. () 02:15:29 KST

4. Job control meta characters

Job control 관련 메타문자를 보자

메타 문자의미
&백그라운드 job
;쉘 명령 분리자
( )subshell
&&조건부 실행 (and)
||조건부 실행 (or)

쉘 명령 분리자 (;)

  • command 1; command2; ...; command n : Shell은 왼쪽에서 오른쪽으로 순차적으로 실행 시킴

예시

$ date; pwd; ls -a
2020. 12. 10. () 02:51:50 KST
/home/202CS133/A
. ..
$ date > date.txt; ls; pwd > pwd.txt
date.txt     # ls의 결과, 이 시점엔 pwd가 수행되기 전이기 때문에 pwd.txt가 리스트에 없음
202CS133@linux01:~/A$ cat date.txt # date의 표준출력이 date.txt에 쓰였는지 확인
2020. 12. 10. () 02:53:50 KST
202CS133@linux01:~/A$ cat pwd.txt # pwd의 표준 출력이 pwd.txt에 쓰였는지 확인
/home/202CS133/A

Subshell이란

현재 쉘 안에서 실행되는 쉘로, 현재 쉘의 자식 프로세스로 실행된다. exit 명령으로 서브 쉘을 종료하고 부모 쉘로 돌아간다.

  • 로그인 시 유닉스는 초기 로그인 shell을 제공한다.
  • 입력된 단순 명령들은 초기 shell에 의해 실행된다.
  • 명령어 그룹 (command group): 괄호 안에 명령 분리자로 묶인 command들에 대해서는 자식 shell을 별도로 생성하여 실행시킨다.

그럼 subshell 실행 방법은?

bash / sh 명령어를 사용하면 된다.

$ v=100         # 부모 shell: v에 100 대입
$ echo $v
100
$ sh            # subshell 실행
$ echo $v       
                # subshell에서는 v가 값을 가지고 있지 않음
$ exit

밑의 예시와 같이 () 괄호 안에 명령 분리자를 이용해 subshell에서 실행하고자 하는 명령어들을 써주면 된다.

예시

$ a=yes
$ (a=no; echo $a) # 자식 shell 생성 후 실행
no                # 자식 shell에서는 a값이 'no'
$ echo $a
yes               # 부모 shell에서는 a값이 'yes'

조건부 실행 (&&, ||)

  • command1 && command2: command1이 성공적으로 끝날 경우에만 command2를 수행한다.
  • command1 || command2: command1이 실패할 경우에만 command2를 수행한다.

예시

$ gcc a.c && ./a.out # 성공적으로 컴파일될 경우, a.out을 실행

$ gcc a.c || echo compile error # 컴파일이 실패할 경우 echo 실행

5. I/O 관련

메타문자의미
|파이프 (pipe)
< <<입력 재지정 (redirection)
> >>출력 재지정 (redirection)
#주석 (comment)
$쉘 변수
!History 기능

파이프 (Pipe, |)

  • command1 | command2: command1의 표준 출력을 command2의 표준입력으로 사용한다. 이 때 command2는 표준입력이 가능한 명령이어야 한다!
$ cut -d: -f1 /etc/passwd | sort > users
$ cat users
201CyberBoan101
201CyberBoan102
201CyberBoan103
201CyberBoan104
...

표준 입출력 (Standard I/O) 은...

  • standard output: 모니터/스크린
  • standard error: 에러 메시지
  • standard input: 키보드

를 말하는 것이다😆 쫄지 말자.


입출력 재지정 (redirection)

  • command > file1: command의 표준 출력을 file1로 보낸다

  • command < file2: file2의 내용을 표준 입력으로 사용하여 명령을 실행한다.

  • >>: 이미 파일이 존재하는 경우 등 append 모드로 출력하고 싶을 때 사용한다!

  • >&: 표준 출력뿐 아니라 standard error까지 파일로 보낸다 (>>&)


여기까지 오늘은 쉘 메타문자에 대해 알아보았다. 시험범위라 가볍게 정리했는데 계속 기억에 남으면 좋겠다😏 왠지 계속 들어와서 볼거같긴 하지만..

0개의 댓글