Bash 는 다음과 같은 주요 기능을 제공한다.
명령행 완성 기능 은 명령어의 일부만 입력하고 [TAB] 키를 눌러 자동으로 명령어를 완성하는 기능이다. 입력후 실행했던 모든 명령어를 히스토리 버퍼에 저장에 스택으로 저장한다.
history 명령어를 입력하면 히스토리 리스트에 있는 명령어 목록이 출력된다. 또한 사용자들이 실행한 명령어들은 각 사용자의 홈 디렉토리의 .bash_history 라는 파일에 저장되며, 로그아웃할 때 메모리에 기억된 명령의 목록을 파일에 저장한다. '!' 로 대체하여 사용할 수 있다.
# history [숫자값]
# 사용한 명령어를 출력한다.
$ history
# 마지막 사용한 명령을 실행한다.
$ !!
# n번째 사용한 명령을 실행한다.
$ !n
# 사용한 명령어 목록을 역으로 세어 n번째 명령어를 실행한다.
$ !-n
# 가장 최근에 사용한 명령중에 '문자열'로 시작하는 명령어를 찾아 실행한다.
$ !문자열
# 가장 최근에 사용한 명령중에 '문자열'을 포함하고 있는 명령어를 찾아 실행한다.
$ !?문자열?
# 마지막에 사용된 명령문의 '문자열1' 을 '문자열2'로 변경해 실행한다.
$ !^문자열1^문자열2!
# .bash_history
.bash_history 파일은 사용자의 홈 디렉터리에 존재하면서 사용자가 입력했던 명령어들이 기록되는 파일이다.
숨김파일이고 현재 로그인해서 내린 명령들은 로그아웃시 저장되므로 다음 로그인에서 확인할 수 있다.
[ctrl] + [r] 명령어를 활성화하고 특정문자열을 입력하면 그 문자열을 포함하는 가장 최근에 사용한 명령을 보여준다. [ENTER] 를 입력하면 실행된다.

alias 를 특정 명령어의 조합으로 지정해 놓으면 사용자가 alias를 입력 했을때 특정 명령어가 대신 실행된다.
# aliasname 으로 기존 명령어의 조합의 alias를 지정한다.
$ alias aliasname = '기존 명령어의 조합'
# 등록된 alias를 해제한다.
$ unalias 등록된 aliasname
# ls 만 실행 시켜도 ls -alF 명령어가 실행되도록 alias를 등록한다.
$ alias ls='ls -alF'
# c 만 입력해도 clear 명령어가 실행되도록 alias를 동록한다.
$ alias c=clear
# 명령행 편집기능
명령행 편집기능 을 통해 명령행에서 커서 이동을 빠르게 하거나, 손쉽게 삭제할 수 있다.
# [Ctrl] + [b] : 커서를 왼쪽으로 한 칸 이동.
# [Ctrl] + [f] : 커서를 오른쪽으로 한 칸 이동.
# [ESC] 후 [b] : 커서를 왼쪽으로 한 단어 이동
# [ESC] 후 [f] : 커서를 오른쪽으로 한 단어 이동
# [Ctrl] + [a] : 커서를 맨 왼쪽으로 이동.
# [Ctrl] + [e] : 커서를 맨 오른쪽으로 이동.
# [Ctrl] + [d] : 커서 오른쪽 한 단어 삭제
# [ESC] 후 [Backspace] : 커서 왼쪽 한 단어 삭제
# [ESC] 후 [d] : 커서 오른쪽 한 단어 삭제
# [Ctrl] + [k] : 커서 왼쪽 행 전체 삭제
# [Ctrl] + [u] : 행 전체 삭제
# [Ctrl] + [y] : 삭제 취소
# 명령 대체기능
명령 대체기능 을 통해 특정 명령의 결과를 다른 명령의 인자로 사용할 수 있다.
// passwd 명령어의 퍼미션을 확인하는 방법
// which 명령어를 통해 passwd 프로그램의 위치를 확인한다.
$ which passwd
/bin/passwd
// ls -l 명령어로 퍼미션을 확인한다.
$ ls -l /bin/passwd
// 명령 대체 기능을 활용하면 한번에 조회할 수 있다.
// ``를 사용하는 경우
$ ls -l `which passwd`
// $()를 사용하는 경우
$ ls -l $(which passwd)
# 그룹 명령 실행
그룹 명령 실행 을 통해 하나의 명령 행에 여러 개의 명령어를 동시에 사용할 수 있다. ; 를 사용해 명령어를 구분하면 순차적 처리가 가능하다.
&& , || 를 사용하면 앞의 명령어의 결과에 따라 다음 명령어의 실행 여부를 결정 할 수 있다.
# ; : 단순히 한 줄의 명령을 나열하기 위해 사용한다. 입력 순서대로 처리한다
# || : 논리적 OR 로 앞의 명령어의 실행 결과가 성공이면 앞의 명령어의 결과를 출력하고 실패이면 뒤의 명령어를 실행하여 결과를 출력한다.
# && : 논리적 AND 로 앞의 명령어의 실행 결과가 성공이어야만 뒤 명령어를 수행한다.
# 순차적으로 ls 명령어를 수행하고 find / -type d 의 결과를 list.txt 파일에 저장한다.
$ ls; find / -type d > list.txt
# ls 명령어의 수행 결과와 find / -type d의 결과를 모두 list.txt 파일에 저장한다.
$(ls; find / -type d) > list.txt
# pwd 를 수행하고 루트로 가 pwd 명령어를 수행하고 다시 돌아와 pwd 명령어를 수행한다(괄호 영향)
$ pwd; (cd / ; pwd); pwd
# zzang 이라는 계정이 없기 때문에 no zzang 문구가 출력된다
$ grep zzang /etc/passwd || echo 'no zzang'
# root 계정이 존제하기 때문에 계정정보가 출력된다.
$ grep root /etc/passwd || echo 'no root'
$ ls
lin.txt
# lin.txt 파일이 존재하므로 이름바꾸기를 수행하고 ls 명령어도 수행한다.
$ mv lin.txt joon.txt && ls
$ ls
joon.txt
# lin.txt 파일이 존재하지 않으므로 ls 명령어를 수행하지 않는다.
$ mv lin.txt joon.txt && ls
# 표준 입출력 제어 기능
리눅스에서는 표준 입력, 표준 출력 이라는 이름의 데이터 흐름을 사용한다. 다양한 입출력장치 중 기준이 되는 입출력을 표준 입출력이라 한다. 표준 입력은 키보드이고 셸에서는 숫자값 0으로 표시한다. 표준 출력은 모니터이고 셸에서는 숫자값 1로 표시한다. 표준 에러는 에러값이 보여지는 화면을 뜻한다. 셸에서는 숫자값 2로 표시한다.
# 리다이렉션
리다이렉션 은 어떤 프로세스의 입/출력을 표준입/출력이 아닌 다른 입/출력으로 변경할때 사용한다. 출력 결과를 파일에 입력하거나 출력 결과를 다른 명령어의 입력값으로 쓰기위해 사용하는 기법이다.
# > 프로세스 출력을 표준 출력에서 다른 출력으로 변경한다
# >> 프로세스의 출력을 지정한 출력(보통 파일)에 추가한다
# < 프로세스의 입력을 표준 입력에서 다른 입력으로 변경한다.
# << 기호 뒤에 지정한 문자열을 입력으로 받아 해당 문자열이 나오기 전까지를 표준 입력으로 삼아 해당 내용을 출력한다.
# 표준 입력인 키보드로 입력한 내용을 tmp.txt 파일에 저장한다.
$ cat > tmp.txt
# 키보드로 입력한 내용을 tmp.txt 파일의 뒷부분에 덧붙인다. 파일이 존재하지 않으면 새로운 파일을 생성한다.
$ cat >> tmp.txt
# tmp.txt 파일의 내용을 wc 명령어의 입력으로 사용한다.
$ wc < tmp.txt
# posein 사용자에게 abc.txt 의 내용을 메일로 보낸다.
$ mail posein < abc.txt
# end 라는 입력이 나오기 전까지 입력한 문자를 출력한다.
$ cat << end
# find 의 결과값을 모두 화면에 보여준다.
$ find / -name '*.txt'
# 결과값은 화면에 보여주고, 에러는 화면에 출력하지 않는다.
$ find / -name '*.txt 2>/dev/null'
# find의 결과값을 파일에 저장하고 에러는 화면에 출력한다.
$ find / -name '*.txt'>list.txt
# 결과값은 파일에 저장하고 에러는 출력하지 않고 버린다.
$ find / -name '*.txt' 2>/dev/null > list.txt
# 에러는 error.txt 파일에 저장한다.
$ find / -name '*.txt' 2>error.txt
# 결과값은 error.txt에 정상값은 result.txt에 저장한다.
$ find / -name '*.txt' 2>error.txt > result.txt
# 결과값과 에러값을 모두 data.txt 라는 한 파일에 저장한다.
$ find / -name '*.txt' > data.txt 2>&1
# 결과값은 화면에 출력하고 에러는 error.txt에 추가한다.
$ find / -name '*.bak' >> error.txt
# 파이프(PIPE)
PIPE 는 프로세스의 통신을 위해 도입된 것으로 어떤 프로세스의 표준 출력이 다른 프로세스의 표준 입력으로 쓰이게 하는 것을 말한다. `|` 기호를 사용하고 , 여러 개의 파이프를 사용하면 파이프라인을 구성하게 되면서 데이터들은 파이프라인을 따라 흐른다.
# 명령어1 | 명령어2
# ls 명령어의 출력이 more filter 의 입력으로 사용되어 결과가 한 화면씩 출력된다.
$ ls -alF | more
# ls 명령어의 출력이 sort를 통해 정렬되고 다시 more를 통해 한 화면씩 출력된다.
$ ls | sort | more
# 파일의 목록을 list.txt라는 파일에 기록함과 동시에 more 을 사용해 화면에도 출력 내용을 보여준다.
$ ls -l | tee list.txt | more
# 'ls -l /etc'의 결과를 현재 디렉터리 안에 etc.txt, /tmp/etc/txt로 저장하고 more 명령어로 한 페이지씩 보여준다.
$ ls -l /etc | tee etc.txt | tee /tmp/etc.txt | more
# 'ls -l /etc'의 결과를 현재 디렉터리 안에 etc.txt로 저장하고
# /dev/pts/0 터미널로 출력하고 more 명령어로 한 페이지씩 보여준다.
$ ls -l /ect | tee etc.txt | tee /dev/pts/0 | more
# xargs 표준 입력으로부터 값을 받아 처리하는 명령으로 보통 다른 명령어와 파이프 기호 조합으로 사용된다.
# a.txt 의 ls -l 결과를 출력한다.
$ echo a.txt | xargs ls -l
# 현재 디렉터리 이하에서 txt로 끝나는 파일이나 디렉터리를 찾아 전부 삭제한다.
$ find -name '*.txt' | xargs rm -rf
# /etc/passwd를 a.txt, b.txt라는 이름으로 하나씩 복사하고 진행과정을 출력한다.
$ echo a.txt b.txt | xargs -n 1 cp -v /ect/passwd
# 작업 제어 기능
작업 제어 기능 을 통해 작업을 백그라운드와 포그라운드에서 실행할 수 있다. 이 작업을 서로 전환하여 실행할 수 있다.
# 산술 연산 기능
expr 명령을 이용하여 산술 연산이 가능하다.
# expr 값 연산자 값
# [] 를 사용하면 띄어쓰기 규칙없이 좀 더 편하게 사칙연산이 가능하다.
// expr 처럼 띄어쓰기를 해도 되고, 안해도 된다.
$ expr [3**3]
27
# bash 관련 파일 및 디렉터리
bash 관련 파일 및 디렉터리 를 통해 환경 변수나 alias 와 같은 휘발성 정보들을 지속적으로 이용할 수 있다.
/etc/profile
시스템 전체(모든 사용자)에 적용되는 환경 변수와 시작 관련 프로그램을 설정한다.
/etc/bashrc
시스템 전체(모든 사용자)에 적용되는 alias와 함수를 설정한다.
~/.bash-profile
개인 사용자의 환경 설정과 시작 프로그램 설정과 관련있는 파일. 로그인 시 읽어들인다. 경로, 환경 변수 등의 설정이 들어있다.
~/.bashrc
개인 사용자가 정의한 alias와 함수들이 있는 파일이다. alias를 지속적으로 사용하려면 이 파일에 설정한다.
~/.bash_logout
개인 사용자가 로그아웃할 때 수행하는 설정을 지정하는 파일이다.
/etc/profile.d
응용 프로그램 이 시작할 때 필요한 스크립트가 위치하는 디렉터리이다.