bash는 FSF(Free Software Foundation)에서 GNU Project의 일환으로 만든 셸 인터프리터이다. Bourne-Again SHell의 약어로 Stephen R. Bourne이 1975년 만든 sh(Bourne Shell이라 부른다)를 기반으로, csh 와 ksh와도 어느정도 호환되도록 만들었다. GNU기반의 운영체제는 대부분 bash를 기본 셸로 사용하고 있다.
# bash --version
GNU bash, version 3.00.16(1)-release (i386-pc-solaris2.10)
Copyright (C) 2004 Free Software Foundation, Inc.
#
커맨드라인 편집
커맨드를 입력하는 곳에서의 단축키에 대한 설명이다.
편집
Ctrl+b: 한글자 뒤로
Ctrl+f: 한글자 앞으로
Del, BackSpace: 왼쪽에 있는 한글자 지우기
Ctrl+d: 커서에 있는 한글자 지우기
Ctrl+_: 마지막 액션 취소
커서 이동
Ctrl+a: 줄의 시작으로
Ctrl+e: 줄의 끝으로
Alt+f: 단어 앞으로
Alt+b: 단어 뒤로
Ctrl+l: 스크린 클리어
킬링, 양킹(요즘에는 Cut, Paste라고 부름)
Ctrl+k: 현재커서부터 마지막 라인까지 Cut
Alt+d: 현재커서가 가리키는 단어의 현재위치부터 단어의 끝까지 Cut
Alt+Del: 현재 커서가 가리키는 단어를 Cut
Ctrl+w: 현재커서가 가리키는 단어의 현재위치부터 단어의 앞을 Cut
Ctrl+y: 최근에 Cut된 내용을 Paste
Alt+y: ?
readline 커맨드
Alt+-: 다음 입력하는 키는 readline 라이브러리의 커맨드로 인식
히스토리
![히스토리번호]: 히스토리 번호에 저장된 명령을 실행. 히스토리 번호는 [history] 또는 [!?] 명령을 이용해 알 수 있음
Ctrl+r: 히스토리 검색 모드로 진입
→ ENTER: 검색한 명령을 실행
→ ESC, Ctrl+j: 검색한 명령을 프린트 하고 검색 모드를 빠져나옴
→ Ctrl+g, Ctrl+c: 검색 취소
자동 실행 스크립트 위치
인터랙티브 로그인 셸(Interactive Login Shell)로 실행되는 경우
→ 로그인 셸로 BASH를 지정한 경우
→ [--login] 옵션을 주어 실행한경우
/etc/profile 파일이 있는 경우 실행
~/.bash_profile, ~/.bash_login, ~/.profile 를 순서대로 찾아 존재하는 파일 하나만 실행한다. 앞의 파일이 존재해 실행했으면 뒤 파일은 실행하지 않는다
로그아웃시: ~/.bash_logout 파일이 있는 경우 실행
인터랙티브 넌로그인 셸(Interactive Non-login Shell)로 실행되는 경우
→ 로그인한 후 셸을 전환하기 위해 bash 명령을 입력한 경우
→ JDS나 CDE에서 터미널을 연 경우
~/.bashrc 파일이 있는 경우 실행
※ 따라서 인터랙티브 로그인셸과 인터랙티브 셸의 환경이 같아지려면 아래와 같은 구문이 로그인 스크립트 안의 어딘가에 들어가야한다.
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
넌인터랙티브 셸(Non-interactive Shell)로 실행되는 경우
→ 셸 스크립트를 실행하기 위해 실행되는 경우
→ 파일 첫머리에 #!/bin/bash 처럼 사용된 경우
BASH_ENV 환경변수에 내용이 있는 경우 이 환경변수가 지정한 파일을 실행. 아래와 같은 구문을 실행한다고 생각할 수 있다.
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
sh라는 파일 명으로 실행시
※ sh처럼 로그인시 /etc/profile 을 실행하고, ~/.profile 가 있을 경우 실행한다.
예시
login as: root
Using keyboard-interactive authentication.
Password:
Last login: Wed Sep 16 09:38:48 2009 from 192.168.0.2
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
/etc/profile.profile
root@wl ~ # bash
.bashrc
root@wl ~ # exit
root@wl ~ # logout
.bash_logout
결론
CentOS/RHEL/OEL 에서는 로그인시 /etc/profile 에서 /etc/inputrc, /etc/profile.d/*.sh 를 읽어들이고, 이후 실행되는 ~/.bash_profile 에서 ~/.bashrc 를 읽도록 스크립트가 짜여져 있으며, 다시 ~/.bashrc에서는 /etc/bashrc 를 읽도록 스크립트가 프로그래밍되어있다. 즉 /etc/inputrc, /etc/profile.d/*.sh, /etc/bashrc 는 bash 내부에서 읽어들이는 스크립트가 아니다.
CentOS 에서 로그인시 읽어들이는 스크립트 위치 정리
/etc/profile
/etc/inputrc
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
하지만 솔라리스에서는 당연히 그러한 스크립트를 제공하지 않는다.
솔라나라에서는 윈디하나의 솔라나라: 솔라리스 10 u7 기본설정에 나와있는 내용대로, 로그인시 /etc/profile 와 ~/.bashrc를 사용하며, 셸 실행시 ~/.bashrc 를 사용한다. sh와 호환되도록 스크립트를 작성한다.
bash 매뉴얼에서는 .bashrc에 alias등을 넣도록 하고 있다. alias는 환경변수에 저장되는 것이 아니기 때문에 셸이 바뀌거나 새롭게 실행되면 초기화되기 때문이다.
시그널
BASH가 인터랙티브 로그인셸로써 실행된 경우 셸 옵션(shopt)에 huponexit가 설정(on)되어있으면 로그아웃시 차일드 프로세스에게 SIGHUP 시그널을 보낸다. 기본값은 off다.
인터랙티브 셸이나 넌인터랙티브 셸로 실행된 경우에는 경우의 수가 다르다. SIGTERM, SIGINT, SIGQUIT 시그널은 무시하는 경우도 있다.
인자를 실행하는 규칙이다. bash는 -를 옵션으로 인식하며, -- 다음에 나오는 -는 옵션으로 인식하지 않는다. *와 ?는 bash에 의해 해석된 후 인자가 넘어간다.
windy@wl ~/argtest $ touch file1
windy@wl ~/argtest $ touch file2
windy@wl ~/argtest $ touch -- "-al"
windy@wl ~/argtest $ cat arg
#!/bin/bash
echo $@
windy@wl ~/argtest $ chmod +x arg
windy@wl ~/argtest $ ls -alhF
총 4
-rw-r--r-- 1 windy staff 0 2월 19일 00:00 -al
-rwxr-xr-x 1 windy staff 20 2월 19일 00:00 arg*
-rw-r--r-- 1 windy staff 0 2월 19일 00:00 file1
-rw-r--r-- 1 windy staff 0 2월 19일 00:00 file2
windy@wl ~/argtest $ ls
-al arg file1 file2
windy@wl ~/argtest $ ls * 1)
-rwxr-xr-x 1 windy staff 20 2월 19일 00:00 arg
-rw-r--r-- 1 windy staff 0 2월 19일 00:00 file1
-rw-r--r-- 1 windy staff 0 2월 19일 00:00 file2
windy@wl ~/argtest $ ls -al -- -al 2)
-rw-r--r-- 1 windy staff 0 2월 19일 00:00 -al
windy@wl ~/argtest $ ./arg *
-al arg file1 file2
windy@wl ~/argtest $ ls "*"
*: 해당 파일이나 디렉토리가 없음
windy@wl ~/argtest $ ./arg -- -f
-- -f
windy@wl ~/argtest $ rm -- -al 3)
windy@wl ~/argtest $ ls -lhF
총 4
-rwxr-xr-x 1 windy staff 20 2월 19일 00:00 arg*
-rw-r--r-- 1 windy staff 0 2월 19일 00:00 file1
-rw-r--r-- 1 windy staff 0 2월 19일 00:00 file2
windy@wl ~/argtest $
1) * 에 의해 넘어간 -al 이 ls 에 의해 옵션으로 해석되었다. 2) ls는 -- 를 처리한다. 3) touch, ls, rm 은 -- 을 [옵션의 끝]으로 인식해 처리한다. rm(1)에 -- 의 처리 방식에 대해 나와있다. (touch, ls는 그런 내용이 없으나 처리하는 것 같다) 바꿔말하면 -- 는 각 프로그램마다 처리해줘야 한다.
히스토리
인자가 없거나 ls, bg, fg, exit 같은 명령에 대해서는 히스토리에 저장하지 않도록 한다. ?나 *도 사용할 수 있다.
root@wl ~ # export HISTIGNORE="&:ls:[bf]g:exit"
중복된 명령어에 대한 히스토리 제거
root@wl ~ # export HISTCONTROL=erasedups
버전이 낮은 경우(3.0 보다 낮은 경우)
root@wl ~ # export HISTCONTROL=ignoreboth