Shell 특수기호는 Shell 메타문자로 불리기도 한다. 쉘은 이런 특수기호들을 해석(interpret)하여 명령을 실행한다. 그래서 쉘 메타문자를 잘 알아두고 일반 문자와 같이 사용하지 않도록 조심할 필요가 있다. 익숙한 정도까지 메타문자를 잘 익히고 활용하면 쉘 조작의 효율을 높일 수도 있을 것이다.😉
파일 이름을 확장하는 데 사용되는 메타문자들이다.
메타 문자 | 의미 |
---|---|
* | 문자열 wildcard |
? | 문자 1개 wildcard |
[ ] | 문자 집합 wildcard |
{ } | 문자열 집합 (comma로 분리) |
wildcard
: 임의의 문자와 매칭할 수 있는 문자
set
] : set
의 문자 중의 하나와 매칭된다set
] 또는 [ ^set
] : set
에 없는 문자 중의 하나와 매칭된다expansion
, { } : 제시된 문자열로 대체$ ls -l /a/b/{c.h,d.h} # ls -l /a/b/c.h /a/b/d.h 로 확장
예시로 더 자세히 살펴 보자.
*
a.c
, a.txt
, a.o
가 있을 때 ?
를 사용하면...
표현 방식 | 결과 |
---|---|
a.? | a.c a.o |
bob
, darlene
, dave
, ed
, frank
, fred
가 있을 때 *
를 사용하면...
표현 방식 | 결과 |
---|---|
fr* | frank fred |
*ed | ed fred |
b* | bob |
*e* | darlene dave ed fred |
*r* | darlene frank fred |
* | bob darlene dave ed frank fred |
d*d | darlene dave |
g* |
[]
중괄호가 집합이 되는 것이다. 중괄호 안에 있는 원소는 집합이 될 수도 있다.
표현 방식 | 매칭되는 문자 |
---|---|
[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 |
{}
괄호 확장은, 우리가 줄여놓은 걸 쉘이 풀어서 써놓는다고 생각하면 쉽다.
표현 방식 | 결과 |
---|---|
b{ed,olt,ar}s | beds bolts bars |
b{ar{d,n,k},ed}s | bards barns barks beds |
Wildcard와 비교 하기
a1.c
, a2.c
, a3.c
가 있을 때
표현 방식 | 결과 |
---|---|
a{1,2,3,4}.c | a1.c a2.c a3.c a4.c |
a[1234].c | a1.c a2.c a3.c |
a?.c | a1.c a2.c a3.c |
*.c | a1.c a2.c a3.c |
커맨드 대치는 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에 저장되는 것을 알 수 있다.
이스케이프 문자는 쉘이 해석하는 것을 원하지 않을 때 사용하는 것이다. 우리가 입력한 그대로의 문자열이 명령의 인자로 들어가게끔!
메타문자 | 의미 |
---|---|
\ | Single character escape |
' ' | String escape (String을 그대로 자식 process에 전달) |
" " | String escape ($와 `를 expand하고 자식 process에 전달) |
$ echo * # ls와 같은 결과
a.c text1 directory1
$ echo \* # *을 그대로 표준 출력으로 보냄
*
$ echo hi > file # file에 표준 입력을 쓰기
$ cat file # file 보기
hi
$ echo hi \> file # 표준 출력에 'hi > file' 보내기
hi > file
$ echo 'this part is not for shell'
this part is not for shell
$ 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
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
현재 쉘 안에서 실행되는 쉘로, 현재 쉘의 자식 프로세스로 실행된다. exit 명령으로 서브 쉘을 종료하고 부모 쉘로 돌아간다.
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 실행
메타문자 | 의미 |
---|---|
| | 파이프 (pipe) |
< << | 입력 재지정 (redirection) |
> >> | 출력 재지정 (redirection) |
# | 주석 (comment) |
$ | 쉘 변수 |
! | History 기능 |
command1 | command2
: command1의 표준 출력을 command2의 표준입력으로 사용한다. 이 때 command2는 표준입력이 가능한 명령이어야 한다!$ cut -d: -f1 /etc/passwd | sort > users
$ cat users
201CyberBoan101
201CyberBoan102
201CyberBoan103
201CyberBoan104
...
를 말하는 것이다😆 쫄지 말자.
command > file1
: command의 표준 출력을 file1로 보낸다
command < file2
: file2의 내용을 표준 입력으로 사용하여 명령을 실행한다.
>>
: 이미 파일이 존재하는 경우 등 append 모드로 출력하고 싶을 때 사용한다!
>&
: 표준 출력뿐 아니라 standard error까지 파일로 보낸다 (>>&
)
여기까지 오늘은 쉘 메타문자에 대해 알아보았다. 시험범위라 가볍게 정리했는데 계속 기억에 남으면 좋겠다😏 왠지 계속 들어와서 볼거같긴 하지만..
끝