728x90

 

==쉘의 설정 및 확인

(1) 현재 쉘의 확인

환경변수 SHELL을 통하여 현재 로그인한 사용자의 쉘을 확인한다.

$ echo $SHELL

/bin/bash

 

(2) 시스템이 지원하는 쉘 목록 확인 - 1

'chsh 명령어'의 -l, --list-shells 옵션을 사용하여 시스템이 지원하는 쉘 목록을 확인할 수 있다. (list)

$ chsh -l  또는 $ chsh --list=shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

 

(3) 시스템이 지원하는 쉘 목록 확인 - 2

'/etc/shells 파일'에 시스템이 지원하는 쉘 목록이 기록되어 있으므로 이 파일을 확인해보기 (concatenate)

$ cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

 

(4) 쉘의 변경

chsh 명령어의 -s 옵션을 사용하여 쉘을 변경할 수 있다. (substitue?)

$ chsh -s /bin/csh

Changing shell for francis.

Password:

Shell changed.

 

(5) 특정 사용자의 쉘 확인

/etc/passwd 파일의 7번째 필드에 해당 사용자가 사용하는 쉘이 무엇인지 기록되어 있다.

원하는 사용자의 쉘만 필터링하기 위해 'grep 명령어'를 활용할 수 있다. (cf. find명령어)

$ cat /etc/passwd | grep francis

francis:x:500:500:francis:/home/francis:/bin/csh (형식의 : 를 구분자로 하여 각각의 요소의 의미는 알아놨을테고)

x는 비번자리 

 

(6) 환경변수를 통한 설정 확인 : set명령어로 확인

$ set

DISPLAY=:0.0

HISTFIlE=/home/francis/.bash_history

HISFILESIZE=1000

HISTSIZE=1000

HOME=/home/francis

HOSTNAME=

LANG=

MAIL=

OSTYPE=

PATH=

...

 

시스템 정보 관련 환경변수 :

HOSTNAME - 시스템의 호스트명

OSTYPE - 실행 중인 시스템의 운영체제 유형에 대한 정보

DISPLAY - X윈도우 트래픽을 처리할 X 디스플레이 서버의 위치

PATH - '실행파일'이 위치한 디렉토리의 집합

LANG - language...

 

 관련 환경변수 :

PS1 - PS는 Prompt Statement 또는 Prompt String 의 약자이며, 그 중 PS1는 기본 프롬프트 표시명을 뜻함

PS2 - PS2는 하나의 명령어를 '여러 줄로 입력할 때' 표시하는 프롬프트 표시명 

SHELL - 로그인한 사용자의 쉘을 보여줌

HISTFILE - history 정보가 저장되어 있는 파일 경로

HISTFILESIZE - history 파일의 크기

HISTSIZE - history 파일의 명령어 개수

 

사용자 관련 환경변수 : 

UID - 로그인한 사용자의 UID

USER - 로그인한 사용자의 계정명

HOME - 로그인한 사용자의 홈 디렉토리

PWD - 로그인한 사요자의 현재 작업 디렉토리의 경로 (print working directory)

 

응용프로그램 관련 환경변수

TERM -  로그인한 사용자의 터미널 종류 (terminal)

MAIL - 수신한 메일이 저장되어 있는 경로

 

(7) 환경변수를 통한 환경설정 예제

환경변수값 확인 : 'echo 명령어'와 'printenv 명령어'를 통해 환경변수의 값을 확인

$ echo $HOME

/home/francis

 

$ printenv PWD

/home/francis

 

환경변수값 설정 :  export 명령어를 통해 환경변수를 추가 정의할 수 있다

$ export MYENV=this-is-my-environment-variable

$ echo $MYENV

this-is-my-environment-variable

 

환경변수값 변경 : 'export 명령어'를 통해 기존 환경변수의 값에 새로운 값을 추가할 수 있다

$ export PATH=/mypath:$PATH($ set명령어 환경변수 확인해보면 PATH에 밸류로 있다)

$ echo $PATH

/mypath:/usr/lib ~

 

 

 

==쉘의 시작과 종료

(1) Login Shell, Non-Login Shell

Login Shell은 사용자가 userid와 passwd 를 입력하여 쉘에 진입하는 방식을 뜻한다.

(ex. putty와 같은 터미널에서 원격서버에 ssh로 접속)

Non-Login Shell은 로그인 없이 

 

(2) Interactive Shell, Non-Interactive Shell

interactive shell은 사용자가 '대화형'으로 쉘을 통해 명령을 입력하고 결과를 받을 수 있는 상태의 쉘

non-interactive shell 은 '쉘스크립트'에서 쉘을 '실행(execute)'하는 경우. 

(ex. 스크립트의 가장 첫줄에 #!/bin/bash 를 기입하면 스크립트를 해석할 때 #! 다음에 나오는 경로의 쉘을 실행한다.

 

(3) 리눅스 쉘의 시작

로그인 쉘 유무와 인터랙티브 쉘 유무에 따라 읽어 들이는 '환경설정 파일'이 다르다.

로그인 쉘인 경우 '시스템 전역 설정 파일'인 /etc/profile /etc/profile.d/* 을 읽어 실행하고,

각 사용자별 실행파일인 '~/.bash_profile' 이나 '~/.bash_login' 그리고 '~/.profile' 순서대로

먼저 존재하는 파일의 설정을 읽어 들여 적용 및 실행한다.

 

로그인 쉘이 아니라면 인터랙티브 쉘 유무를 확인한다. 인터랙티브 쉘인 경우 '시스템 전역 설정 파일'인 /etc/bashrc 파일을 읽어들이고(rc: run commands, etc: config file) '사용자 설정 파일'인 ~/.bashrc를 실행한다.

인터랙티브 쉘 또한 아니라면 환경변수 $BASH_ENV에 설정되어 있는 스크립트를 'source 명령어'를 통해 실행한다.

 

로그인 쉘 인 경우, /etc/profile, /etc/profile.d/*

 

로그인 쉘 아닌 경우,

인터랙티브 쉘 인 경우 - /etc/bashrc -> ~/.bashrc

인터랩티브 쉘 아닌 경우  - source명령어 -> $BASH_ENV 확인

 

(4) 리눅스 쉘의 종료 

 

(5) 리눅스 쉘의 설정파일

시스템 설정 파일 : 

/etc/profile - 시스템 전역으로 설정할 수 있는 쉘 설정파일이다.

/etc/profile.d/* - 사용자가 로그인할 때 /etc/profile.d 디렉토리안에 있는 모든(*) 쉘 스크립트를 실행한다.

/etc/bashrc - 시스템 전역의 성격을 갖고 있으며 쉘에서 또 다른 쉘을 실행하는 비로그인 쉘을 실행할 때마다 로드되는 파일

 

사용자 설정 파일 :

~/.bash_profile

~/.bash_login

한 번 로그인되면 로그아웃될 때까지 실행된다 

주로 bash와는 직접 관련이 없는 사항을 기재한다

 

~/.profile

사용자가 시스템에 로그인할 때마다 실행된다 .

주로 bash와는 직접 관련이 없는 사항을 기재한다.

 

~/.bashrc

비로그인 쉘에서 실행된다 

로그인한 상태에서 새로운 터미널을 열 때마다 이 파일이 로드된다.

보통 alias 설정이나 함수를 저장한다

 

~/.bash_logout 

로그인한 쉘을 로그아웃할 때마다 실행하는 설정파일.,

사용자 계정의 임시파일을 제거하는 등의 사용자 관리 목적으로 유용하게 사용할 수 있다.

 

 

 

 

 

==

[5] 쉘의 기능 - 총 13개의 서브 카테고리로 정리 (1) ~ (13)

(1) 자동완성기능(bash-completion)

 

(2) history 기능

history명령을 옵션 없이 치면 

저장한 명령어 리스트가 나온다

$ history 

  1 history

  2 echo $SHELL

  3 ls -l 
  4 ls 

  5 history

 

 

특정 명령어를 실행하기 위해서 'history 명령'을 통해 열람한 명령어의 번호를 !와 붙여 사용한다.

$ !2

echo $SHELL

/bin/bash

 

사용자가 입력한 명령어는 홈 디렉토리의 ' .bash_history 파일 '에 저장되므로 사용자가 로그아웃하여도 히스토리는 유지된다.

$ history -c 

$ history 

1 history

 

바로 직전 명령어를 실행하기 위해서는 !!를 입력한다

$ !!

echo $SHELL

/bin/bash 

 

가장 최근 3개의 히스토리만 보고 싶을 경우 history 3을 입력.

$ history 3

  5 history

  6 echo $SHELL

  7 history 3

 

(3) alias 기능

자주 사용하는 것을 별칭으로 사용할 때 

$ alias show-me-the-passwd='cat /etc/passwd'

$ show-me-the-passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

 

이미 지정된 alias를 확인하려면 

$ alias 

alias ll='ls -l --color=auto'

alias ls='ls --color=auto'

alias show-me-the-passwd='cat /etc/passwd'

alias vi='vim'

 

alis를 해제하려면 unalias명령어 사용

$ unalias show-me-the-passwd

 

해제 하고 다시 확인하면 

$ alias 

alias ll='ls -l --color=auto'

alias ls='ls --color=auto'

alias vi='vim'

 

 

(4) 쉘 키보드 단축기 (shortcuts 알아볼것)

화면제어 :

커서제어 :

클립보드 활용(자르고 붙이고) :

삭제 : 

 

(5) 명령어 치환 기능(substitution)

$(command)

또는 

'command'

 

예제 : touch 명령어를 통해 '현재 시각'을 파일명으로 갖는 파일이 생성(touch명령어로 파일생성) 옵션으로 파일명은 '$(date)'로 된다.

 

$ touch '$(date)'

$ ls

Thu Aug 29 ~ 

 

 

(6) 표준 입출력 기능(standard I/O)

리눅스 커널은 사용자로부터 기본으로 입력 받을 장치와 사용자에게 결과를 출력할 장치라는 개념을 통해 사용자의 입력을 프로그램에게 전달하고 프로그램의 결과를 사용자에게 보여준다.

 

구분 약어 파일 디스크립터 설명
표준 입력 stdin 0 프로그램(프로세스)에게 데이터를 전달할 때 사용하는 기본 장치
표준 출력 stdout 1 프로그램의 출력을 표시하는 기본 장치
표준 에러 stderr 2 프로그램의 에러를 표시하는 기본 장치 

 

(7) 리다이렉션 기능(redirection)

프로그램의 표준입력 및 표준출력을 다른 장치로 재지정하는 것을 말한다.

표준 출력과 관련하여 '>', '>>'가 있고, 표준 입력과 관련하여 '<', '<<'가 있다. (C++에서의 기호와 ...)

 

> : 프로그램의 출력을 표준 출력에서 지정한 출력으로 변경

>> : 프로그램의 출력을 표준 출력에서 지정한 출력으로 변경하고 추가

< : 프로그램의 입력을 표준 입력에서 지정한 입력으로 변경

<< :  프로그램의 입력을 여러 줄 받을 때 사용하며 지정한 문자열을 입력하면 입력이 종료

 

ls -l 출력결과를 listing-file 파일로 표준 출력을 재지정하였다. 

cat 명령어로 확인해보면 ls 명령어의 출력 결과가 저장되어 있음을 확인할 수 있다 =.

$ ls -l > listing-file

$ cat listing-file

total 4

drwxrwxr-x. 3 frincis francis 4096 Aug 29 20:30 abc

-rw-rw-r--.1 francis francis 0 Aug 29 21:47 listing-file

 

음악 파일(확장자 .mp3)의 재생을 표준 출력이 아닌 오디오 장치로 재지정

$ cat kpop.mp3 > /dev/audio

 

표준 입력을 파일로 재지정하여 sort 프로그램에게 데이터를 전달하였다.

sort 프로그램이 전달 받은 데이터를 정렬하여 표준 출력인 화면으로 표시.

 

$ sort < listing-file

drwxrwxr-x. 3 francis francis 4096 Aug 29 20:30 abc

-rw-rw-r--. 1 francis francis 0 Aug 29 21:47 listing-file

total 4

 

cat 명령어의 옵션에 존재하지 않는 파일을 지정하면 에러가 표준 에러로 발생한다. 이 에러를 표준 에러에서 파일로 재지정 하였다.

$ cat no-file 2>errorfiles

$ cat errorfiles

cat: no-file: No such file or directory

 

 표준 에러의 재지정은 사용자가 스크립트를 실행할 때 에러만을 따로 파일로 저장할 수 있고 화면 출력에는 에러 없이 정보만을 전달 할 수 있어 유용하다.

 

# tmp 디렉토리에 존재하는 파일을 먼저 확인 (#는 주석)

$ ls /tmp

 

 

# tmp 폴더에 pulse로 시작하는 파일을 찾고 표준 에러는 error.log 파일로 재지정. 그 결과 찾은 파일은 표준 출력인 화면에 표시되었다

$ find /tmp -name 'pulse*' 2>error.log

/tmp/pulse-9UACuUnpJG3o

/tmp/pulse-aPtHWnnB6di0

/tmp/pulsefC6j774VGVtc

 

 

# 파일을 찾다가 에러가 발생했다면 error.log에 저장되었을 것이다. 확인해보니 일부 디렉토리는 권한이 없어 찾기 실패 

$ cat error.log

find: '/tmp/gconfd-gdm': Permission denied

 

프로그램의 에러에 관심이 없을 경우 null장치(실제 존재하지 않는 논리적 장치)로 보낼 수도 있다.

$ no-exist-command 2> /dev/null

 

리눅스 관리자가 어떤 명령어의 실행 결과와 에러를 모두 한 파일로 표준출력을 재지정하고 싶어할 수도 있다.

특히 표준 에러를 의미하는 파일 디스크립터2를 &를 통해 표준 출력을 의미하는 파일디스크립터1 로 재지정.

 

# 존재하지 않는 디렉토리 Deskto와 존재하는 디렉토리 Documents 의 출력 결과와 에러를 모두 dirlist파일로 재지정

$ ls Deskto Documents > dirlist 2>&1

 

# cat 명령어를 사용하여 dirlist의 내용을 보면 존재하지 않는 디렉토리 Deskto 에 대한 오류와 Documents 디렉토리내의 파일이 무엇이 있는지 보여주고 있다 

$ cat dirlist

ls: cannot access Deskto: No such file or directory

Documents:

myfiles

 

참고:

https://inpa.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-devnull-%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%EC%85%98-%EA%B8%B0%ED%98%B8-%EC%A2%85%EB%A5%98

 

🐧 /dev/null 2>&1 명령어 의미 - 완벽 이해하기

리눅스 리다이렉션 2>&1 는 표준에러를 표준출력으로 redirection 하라는 의미이다. 보통 프로그램에서 에러가 발생하면, 화면에 에러메세지를 표시해서 사용자에게 경고를 주게 된다. 이러한 기본

inpa.tistory.com

 

(8) 파이프 기능 : IPC(Inter Process Communication) 프로세스 간 통신. 넘기기.

프로그램의 출력결과를 또 다른 프로그램의 입력으로 전달할 수 있는 일종의 프로세스 간 통신 기술이다.

'|'을 통하여 파이프 기능을 사용할 수 있고 파이프를 중첩하여 사용할 수도 있다

command1 | command2 | command3

 

아래와 같이 ls -l 명령어의 출력이 한 화면을 넘어간다면 파이프를 통해 그 결과를 less 명령어로 넘겨 마우스 스크롤이나 키보드로 결과를 살펴볼 수 있다.

$ ls -l | less

 

 

tee 명령어는 표준 입력으로부터 데이터를 읽어 표준 출력으로 출력하거나 또는 이와 동시에 파일에 저장할 수 있다.

tee 명령어는 표준 출력과 파일 저장을 동시에 수행할 수 있기 때문에 하나의 파이프라인을 양 갈래로 나누어 보낼 수 있다.

ls -l | tee file.txt | less

 

tee 명령은 단독으로 사용 가능하고 파일명을 지정한 경우 표준 출력과 파일에 동시에 보낼 수 있다. 또한 다른 프로그램의 출력 결과를 표준 입력으로 받을 수도 있다.

# tee 명령만 단독으로 사용하면 표준입력, 즉 키보드 입력을 기다리고 입력이 들어오면 표준 출력인 화면에 표시된다.

$ tee 

Hello

Hello

 

# tee 명령 뒤에 파일명을 적으면 표준 출력과 동시에 파일도 저장된다

$ tee hello-file

hello

hello

 

$ ls -l | grep hello

-rw-rw-r--. 1 francis francis 6 Aug 30 15:53 hello-file

 

# 파이프를 사용해서 ping 명령의 '출력 결과'를 '표준 입력'으로 받아 화면과 동시에 '파일에 저장'할 수 있다.

$ ping google.com -c 1 | tee result.txt

 

PING google.com (172.217.161.78) 56(84) bytes of data.

64 bytes from nrt20s090in-f14.1e100.net (172.217.161.78): icmp_sq=1 ttl=53 time=34.7ms

 

--- google.com ping statistics ---

1 packets transmitted. 1 received. 0% packet loss. time 37ms

rtt min/avg/max/mdev = 34.767/34.767/34.767/0.000ms

 

$ ls result.txt

result.txt

 

tee 명령어에 -a 옵션을 사용하고 파일명을 기재하면 파일이 새로 생성되는 것이 아니라 파일 맨 끝에 추가된다. (append)

$ ping google.com -c 1 | tee -a result.txt

 

 

 

(9) 그룹 명령 기능 

제어연산자(control operator)인 ' ; ' 와 ' || ' 그리고  ' && '를 통해 한 번에 여러 개의 명령어를 입력할 수 있다.

' ; '는 나열한 순서대로 명령어를 실행하고자 할 때 사용한다

$ echo "first" ; echo "second" ; echo :third"

first

second

third

 

' || '은 앞의 명령어의 실행이 성공하면 그 결과를 출력하고 실패하면 그 다음 명령어를 실행한다. ( || 실패해도 다음거 진행)

' || '은 여러 번 사용가능하다.

$ rm abc || eccho "second"

rm: cannot remove 'abc': No such file or directory

second

 

'&&'은 앞의 명령어의 실행이 성공한 경우에 다음 명령어를 실행한다. ( 모두 참이어야 결과가 참 - 다음 명령어실행)

http://www.tcpschool.com/php/php_operator_logic(논리연산자)

' || '과 마찬가지로 여러 번 사용할 수 있다. 

 

ex)

ls 명령어에 잘못된 옵션을 넣은 경우 succeed가 출력되지 않았지만 올바른 옵션인 -l을 입력한 경우는 succeed가 출력됨.

$ ls invalidoption && echo 'succeed'

ls : cannnot access invalidoption: No such file or directory (성공하지 않았기에 다음 명령어로 진행되지 않았음)

 

$ ls -l && echo 'succedd'

total 4

drwxrwxr-x. 3 franscis francis 4096 Aug 29 20:30 abc

succeed

 

제어연산자(control operator) : $?, &, #, \, |, ;, ||, &&

이전 명령어의 종료코드를 확인하기 위한 '$?'과 프로세스를 백그라운드로 보내 실행하기 위한 '&' 그리고 주석을 의미하는 '#'이 모두 제어연산자이다. 그 외에 제어 연산자를 무효화(escaping)하거나 여러 줄의 명령어를 사용하기 위한 '\'와 리다이렉션을 위한 '|'도 제어연산자이다.

 

 

 

(10) 작업 제어 기능(Job Control Command)

쉘에서 실행하는 프로세스를 job 혹은 작업이라고 부른다.  (The process that runs on the shell is called a job.)

작업은 각각 foreground, background, stopped 의 3가지 상태를 갖는다. (The operation has three states : foreground, background, stopped, respectively. )

작업을 background로 실행할 땐 '&'를 사용한다. (Use '&' when running a job as a background.)

작업 간 전환을 위해 fg, bg 명령을 사용한다. (Use 'fg', 'bg' commands for switching between tasks.)

현재 shell에서 실행한 작업의 목록은 jobs 명령어로 알 수 있다. (A list of tasks currently executed in the shell can be found in the "jobs" command.)

 

 

 

(11) 산술 논리 연산 기능 : expr (expression, 평가가 되는 표현식) 

expr 명령어를 통해 산술, 논리 연산을 수행할 수 있다.

expr 명령어에 산술 논리 연산 시 연산자와 피연산자는 공백으로 반드시 구분되어야 한다.

 

# 공백을 주지 않으면 연산이 아닌 '스트링 입력'으로 간주한다.

그래서 

$ expr 1+2 

1+2 //이렇게 '1+2'와 같은 것처럼 string으로 인식한다. 

 

expr 를 위한 기호가 '특수문자'에 해당하면 \, " ", ' ' 등을 사용해야 ( 이스케이핑 해줘서 '특수문자'에서 '연산'을 위한 기호로 만들어줘야함.) 아래는 예시

$ expr 2 * 2

expr: syntax error

 

$ expr 2 \* 2

4

 

$ expr 2 '*' 2

4

 

$ expr 2 "*" 2

4

 

' | '은 OR 논리 비교를 수행한다. (OR논리연산이기에, 연산 및 연산자의 성질에 대해서 생각).

앞의 피연산자가 0이거나 ' '이면 의 피연산자를 출력한다.  그렇지 않으면, 의 피연산자를 출력한다.

 

'&'는 AND 논리 비교를 수행한다. 

앞 또는 뒤의 피연산자가 0이거나 ' '이면 0을 리턴한다. 피연산자 최소 둘 중 하나가 0이건 ' '공백문자이면 0을 반환. 결과가 0이 되기에. 그렇지 않으면, 의 피연산자를 출력한다.

 

 

정리하자면, 

산술연산: 사칙연산 + 나머지연산

$ expr 1 + 2      # 공백문자해줘야 하죠. 안하면 string으로 인식한다고 위에서 언급한 내용.

3

 

$ expr 3 - 1

2

 

$ expr 2 \* 3      # expr를 위한 기호로 만들어 주기 위한 escaping 

6

 

$ expr 4 / 2

2

 

$ expr 5 % 2

1

 

 

논리연산 : ***중요!

' | ' 경우, 의미는 OR 

예) 

$ expr 2 '|' 3       # 이전 위에서 expr 를 위한 기호가 '특수문자'에 해당하면 \, " ", ' ' 등을 사용해야 ( 이스케이핑 해줘서 '특수문자'에서 '연산'을 위한 기호로 만들어줘야함.) 라고 했다. 앞의 피연산자가 0이거나 ' '이면 의 피연산자를 출력한다.  그렇지 않으면, 앞의 피연산자를 출력한다.(expr 2 '|' 3 인 경우, 그렇지 않으니 앞의 피연산자 2가 출력된다)

2

 

$ expr 0 '|' 3      # 앞의 피연산자가 0이거나 ' '이면 의 피연산자를 출력한다.

 

$ expr 'a' '|' 3    # 앞의 피연산자가 0이거나 ' '이면 의 피연산자를 출력한다.  그렇지 않으면, 의 피연산자를 출력한다.

a

 

$ expr '' '|' 3     # 앞의 피연산자가 0이거나 ' '이면 의 피연산자를 출력한다.

3

 

$ expr '' '|' ''     # 앞의 피연산자가 0이거나 ' '이면 의 피연산자를 출력한다.

0

 

 

 

' & ' 경우, 의미는 AND 

$ expr 0 '&' 2    # 앞 또는 뒤의 피연산자가 0이거나 ' '이면 0을 리턴

0

 

$ expr '' '&' 'a'   # 앞 또는 뒤의 피연산자가 0이거나 ' '이면 0을 리턴

0

 

$ expr 'a' '&' 0   # 앞 또는 뒤의 피연산자가 0이거나 ' '이면 0을 리턴

0

 

$ expr 'a' '&' ''

0

 

$ expr 1 '&' 3   # 앞 또는 뒤의 피연산자가 0이거나 ' '이면 0을 리턴한다. 피연산자 최소 둘 중 하나가 0이건 ' '공백문자이면 0을 반환. 결과가 0이 되기에. 그렇지 않으면, 의 피연산자를 출력한다.

1

 

$ expr 5 '&' 3   # 앞 또는 뒤의 피연산자가 0이거나 ' '이면 0을 리턴한다. 피연산자 최소 둘 중 하나가 0이건 ' '공백문자이면 0을 반환. 결과가 0이 되기에. 그렇지 않으면, 의 피연산자를 출력한다.

5

 

expr 명령어의 스트링 연산과 '정규식' 기능

expr 명령어는 /usr/bin 에 위치하지만 bash 에서는 내장된 expr을 사용한다.

expr 명령어는 산술 논리 연산뿐 아니라 문자열(string) 길이 계산, 서브스트링(substring), 스트링 매칭(string matching)과 같은 '스트링 연산'과 '정규식' (문자열 관련) 계산이 가능하다. 

expr 명령어에 'length 옵션(딱봐도 추측가능한 옵션명)'을 사용하여 스트링의 길이를 구할 수 있다.

$ expr length "hello"

5

 

expr 명령어의 substr 옵션을 통해 서브스트링을 구할 수 있다. (어느 언어에 지원해주는 문자열 처리 중 substring기능)

$ expr substr 'hello world!!!' 7 5

# 의미는  7번째 인덱스부터 5개 추려라.

world

 

":"를 통해 두 스트링 몇 글자(n글자) 매칭되는지 알 수 있다.(오..? 좋은데)

$ expr hellworld : hello 

5

 

(12) 프롬프트 제어 기능

환경변수 PS1, PS2, PS3, PS4를 통하여 '쉘 프롬프트'를 변경할 수 있다. 

$ export PS1="dollar" (쉘 프롬프트를 $에서 dollar로 변경)

dollar

 

cf. 쉘 프롬프트에 대해서 

 

 

 

 

(13) 확장된 내부 명령어 

외부 명령어가 아닌 쉘 자체적으로 수행 가능한 빌트인 명령어, 즉 내부 명령어를 다양하게 제공한다

 

[입출력] 

echo : 변수나 표현식을 표준 출력으로 출력함

printf : 형식화된 출력을 수행

$ printf "%s %s/n" hello world

hello world

read : 변수값을 표준입력에서 읽어들임

 

[파일시스템]

cd : 디렉토리를 변경

pwd : 현재 디렉토리 표시

pushd, popd, dirs : 디렉토리를 스택에 push, pop하거나 현재 스택의 목록을 볼 때 사용

 

[변수]

let : 변수에 대해 산술 연산 수행

eval : 인자를 명령어로 변환

set : 내부 스크립트의 변수값을 변경

unset : 스크립트의 변수를 null로 지움

export : 변수에 값 설정

 

스크립트

source : 지정한 파일을 스크립트로 실행

exit : 스크립트 종료

exec : 프로세스를 실행할 때 fork하지 않고 쉘 자체에서 실행함

 

쉘과 '메타문자'

하나의 명령은 '명령어'와 '명령어 인자' 그리고 '명령어 옵션'과 '옵션 인자'로 구성되어 있고 공백으로 구분된다.

쉘이 명령어에게 명령어 인자, 옵션 인자 등을 전달하기 전에 특수문자가 있는데, 이를 메타문자라고 한다.

 

> : 표준 출력 리다이렉션

>> : 표준 출력 리다이렉션(데이터 끝에 추가, append처럼)

< : 표준 입력 리다이렉션

<< : 표준 입력 리다이렉션(여러줄 입력)

* : 와일드카드문자. 0개 이상의 글자와 매칭(파일매칭) 

? : 와일드카드문자. 단 1개의 글자와 매칭(파일매칭)

[ ] : 와일드카드문자. 브라켓사이에 열거한(enum) 글자들과 매칭.

'cmd' : 명령어 치환 기능

$(cmd) : 명령어 치환 기능

| : 파이프 기능

; : 그룹명령기능을 위해 사용. 순차적으로 명령어 실행.

|| :그룹명령기능. 명령어의 실행 결과가 실패하면 명령어를 실행.

&& : 그룹명령기능. 명령어의 실행결과가 성공하면 명령어 실행.

() : 여러 개의 명령어들을 그룹화할 수 있고 연산자의 우선순위 조절에도 사용가능

& : 명령어를 백그라운드에서 실행

# : 쉘은 이 기호에 대하여 아무런 해석도 하지 않는다. 주석처리.

$ : 쉘에서 사용하는 변수를 의미. 변수가 담고 있는 값을 반환.

\ : escape문자. 해당 기호 다음 '특수문자'의 해석을 하지 않도록 쉘에게 지시. 명령어 입력 시 여러 줄로 입력하고자 할때 줄 끝에 입력하기도 한다.

+ Recent posts