Bash는 본 쉘에 대해 자유 소프트웨어 대체로 GNU 프로젝트를 위해 브라이언 폭스(Brian Fox)에 의해 작성된 유닉스 쉘과 명령 언어입니다. 1989년에 처음 출시되었으며, 대부분의 리눅스 배포판에서 기본 로그인 쉘로 사용되어 왔습니다. 하나의 버전은 리눅스에 대한 윈도우 하위시스템을 통해 윈도우 10을 위해 사용할 수 있습니다. 그것은 역시 솔라리스 11의 기본 사용자 쉘이기도 합니다. Bash는 역시 기본 쉘을 zsh로 변경한 macOS Catalina의 2019 릴리스 이전에 모든 버전의 애플 macOS에서 기본 쉘이었지만, Bash는 현재 대체 쉘로 계속 사용하도록 남겨져 있습니다.
Bash는 전형적으로 사용자가 동작을 유발하는 명령을 입력하는 텍스트 창에서 실행되는 명령 프로세서입니다. Bash는 역시 쉘 스크립트라고 하는 파일에서 명령을 읽고 실행할 수 있습니다. 대부분의 유닉스 셸과 마찬가지로, 그것은 파일 이름 글로빙 (와일드카드 일치), 파이핑, here 문서, 명령 대체, 변수, 및 조건-테스트와 반복을 위한 제어 구조를 지원합니다. 키워드, 구문, 동적 범위 변수 및 언어의 기타 기본 기능은 모두 sh에서 복사됩니다. 역사와 같은 다른 기능은 csh와 ksh에서 복사됩니다. Bash는 POSIX-호환 쉘이지만 많은 확장을 가집니다.
쉘의 이름은 Bourne Again Shell의 머리글자어이며, 그것이 대체하는 Bourne 쉘의 이름과[16] "다시 태어난다"라는 개념의 언어-유희입니다.
쉘-충격이라고 하는, 버전 1.03 (1989년 8월)부터 Bash의 보안 구멍이 2014년 9월 초에 발견되었으며, 빠르게 인터넷 전반에 걸쳐 다양한 공격으로 이어졌습니다. 버그를 수정하기 위한 패치는 버그가 식별된 직후에 곧 제공되었습니다.
Installation
bash는 데비안의 기본 패키지이므로 처음 데비안을 설치할 때에 같이 설치됩니다. 비록 데비안에서 다른 쉘을 사용할 계획이더라도 bash를 지우지 마십시오.
- sudo apt install bash
Oh my bash
배쉬의 대안으로 z shell, 즉, zsh를 사용할 수 있고, 추가적인 여러 기능을 제공하는 on my zsh 프로젝트가 있습니다. 배쉬에서도 이와 유사한 프로젝트, oh my bash가 있고, 다음과 같이 설치할 수 있습니다:
- sudo apt install curl git
- bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"
그런-댜음 .bashrc 파일이 새롭게 만들어지고, 이전 .bashrc는 .bashrc.pre-oh-my-bash로 바꿔어 저장되어 있습니다. 대체로 이전의 .bashrc파일의 내용도 자주 사용하기 때문에, 새롭게 만들어진 .bashrc를 열어서 맨 아래에 이어서 저장해 둘 필요가 있습니다.
테마는 .oh-my-bash/themes/ 에 나열되어 있고, .bashrc에서 다음과 같이 디텍토리 이름을 적어줌으로써 변경될 수 있습니다:
OSH_THEME="powerline"
간혹은 글꼴이 없어서 화면 표현에 문제가 발생하기도 하는데, 다음 패키지를 설치해서 해결할 수 있습니다:
- sudo apt install fonts-powerline
Syntax highlighting
아래와 같이 설치할 수 있습니다.
- git clone https://github.com/akinomyoga/ble.sh.git
- cd ble.sh
- make
- make INSDIR="$HOME/.local/share/blesh" install
그런-다음 .bashrc를 다음과 같이 설정합니다:
# bashrc 처음 시작 부분에 삽입합니다:
[[ $- == *i* ]] &&
source "$HOME/.local/share/blesh/ble.sh" --noattach
# ... 이전의 bashrc 설정을 그대로 둡니다 ...
# bashrc 마지막 부분에 삽입합니다:
[[ ${BLE_VERSION-} ]] && ble-attach
Configurations
다른 방법도 있지만, ~/.blerc 파일에서 설정하는 것이 좋습니다. 가장 중요한 현재 색깔 설정은 다음 명령으로 확인할 수 있습니다:
- ble-color-setface
그런-다음 색깔을 바꾸고 싶을 때에는 아래와 같이 ble-face 명령 뒤에 특정 색깔 명칭을 적어서 수행할 수 있습니다:
# blerc
ble-face auto_complete=fg=238,bg=254
#ble-face auto_complete=fg=white,bg=69
#ble-face auto_complete=fg=240,underline,italic
bleopt default_keymap=vi
update
- ble-update (ble.sh session)
- bash /path/to/ble.sh --update
Configuration
Login shell
사용자의 기본 로긴 쉘은 /etc/passwd에 정의되어 있습니다. 로긴 쉘은 passwd에 포함되어 있는 chsh 유틸리티를 사용하여 바꿀 수 있습니다.
File
쉘 동작을 결정하는 많은 설정은, 변수를 통해 정의할 수 있습니다. 이러한 변수들은 여러 다른 파일에서 정의가 되지만, 마지막 파일의 설정이 이전 파일의 정의를 덮어씁니다.
- /etc/profile - 모든 사용자의 초기 설정.
- /home/USER/.bash_profile - 해당 사용자에 대한 설정.
- /home/USER/.bash_login - 만약 /home/USER/.bash_profile이 존재하지 않으면, 해당 사용자에 대한 설정.
- /home/USER/.profile - 만약 /home/USER/.bash_profile와 /home/USER/.bash_login가 존재하지 않으면, 해당 사용자의 설정
만약 쉘이 로긴없이(즉, 데스크탑의 터미널에서 실행) 시작되면, 다음 파일이 사용됩니다:
- /etc/bash.bashrc - 모든 사용자에 대한 초기 설정.
- /home/USER/.bashrc - 해당 사용자에 대한 설정.
많은 리눅스 배포판에서, 시스템에 로그인할 때 /etc/bashrc와 /home/USER/.bashrc가 항상 점검하기 위해서 /etc/bashrc 파일이 /etc/profile에서 파싱됩니다. 최종 설정은 개인적인 .bashrc 파일에서 정의됩니다.
Tab completion
bash-completion 패키지는 그들 매개 변수와 다른 프로그램의 명령어를 자동-완성해 줍니다. 자동-완성을 위해서는 해당 꾸러미를 설치만 하면 되며, 별도의 설정이 필요하지는 않습니다.
- sudo apt install bash-completion
모든 지원하는 프로그램들은 배쉬 자동-완성을 기본으로 활성화됩니다.
Usage
environment variable
export 속성이 설정된 현재 쉘 프로세스의 모든 변수를 확인하십시오:
- export
물론, 사용자는 자신에게 필요한 변수를 export 할 수 있으며, 현재 프로세서와 상속받는 하위 프로세서에서 유효합니다:
- export MYSTUFF=Hello
환경 변수는 간단한 명령에 할당 목록을 추가하여 개별적인 하위 프로세스에 현지화될 수도 있습니다. execve()에 전달된 결과의 환경은 호출 쉘 프로세스의 환경과 할당 목록의 합쳐집니다:
- make -j NUM_THREADS=16 deb-pkg LOCALVERSION=-041413-ryzen
변수의 값을 확인하기 위해서는:
- typeset -p MYSTUFF
PS1
특별한 쉘 변수인 PS1은 터미널 프롬프트가 어떻게 보일지에 대해 정의합니다:
MyUserName@MyPC: ~ $
이 프롬프트는 다음의 PS1 변수에 대한 값으로 나타내어진 것입니다:
PS1="\u@\h \w $ "
다음 표의 목록은 PS1 변수에서 사용할 수 있는 가능한 자리-표시자입니다:
코드 | 효과 |
\u | 사용자. |
\h | 호스트. |
\w | 현재 디렉토리. |
\d | 오늘 날짜. |
\t | 현재 시간. |
\$ | 루트 사용자는 '#' 그리고 일반 사용자는 '$'으로 나타내는 표시자. |
\j | 현재 실행중인 태스크(jobs)의 수. |
명령 대체를 사용하여 프롬프트에 완전한 명령을 넣을 수도 있습니다. 여기서는 cut -d\ -f1 /proc/loadavg 명령을 실행하여 프롬프트 시작 부분에 1분 동안의 로드 평균을 표시하고자 합니다: PS1="\$(cut -d\ -f1 /proc/loadavg) $ "
다음과 같이 보입니다:
0.10 $
프롬프트에 색깔을 입힐 수도 있습니다:
PS1="\e[0;32m\]\u@\h \w >\e[0m\] "
\e[0;32m\]은 모든 다음 출력에 대해 색상을 변경하며, 변수의 끝에 반드시 \e[0m\]를 써서 색상을 재설정해야 하며, 그렇지 않으면 모든 것이 녹색으로 입력됩니다.
색깔 코드:
코드 | 색깔 |
\e[0;30m\] | 검정색 |
\e[0;31m\] | 빨간색 |
\e[0;32m\] | 초록색 |
\e[0;33m\] | 노란색 |
\e[0;34m\] | 파란색 |
\e[0;35m\] | Magenta |
\e[0;36m\] | Cyan |
\e[0;37m\] | 하얀색 |
\e[0m\] | 기본 색깔로 재설정 |
\e[0;31m\]의 0;은 전경색을 의미합니다. 전경색 굵게는 1;및 전경색 밑줄은 4;와 같은 다른 값을 정의할 수 있습니다. 이 숫자를 생략하면 배경을 나타냅니다, 예를 들어, \e[31m\].
set
set 명령은 bash 쉘에서 설정을 표시하고 변경하는 데 사용됩니다.
모든 현재 설정을 보여줍니다:
- set -o
쉘 내역을 비활성화합니다:
- set +o history
쉘 내역을 활성화합니다:
- set -o history
alias
alias 내장 명령을 사용하여 새 명령을 정의하거나 기존 명령을 재정의할 수 있습니다:
- alias ll='ls -l'
이제 ll(두 개의 소문자 L)이 쉘로 보내지면, 실제로는 ls -l이 실행됩니다.
alias를 제거하기 위해서는:
- unalias ll
alias을 일시적으로 무시하려면 백 슬래시 문자(\)로 명령의 첫 번째 문자를 이스케이프 처리할 수 있습니다:
- \ls
history
세션에서 사용된 명령의 내역은 사용자의 홈 디렉토리에 있는 파일에 기록됩니다. 내역 내에서 명령에 접근하는 가장 쉬운 방법은 ↑과 ↓ 키를 사용하는 것입니다.
현재 내역의 전체 명령을 보기 위해서는:
- history
내역 내의 명령에 대한 검색을 하기 위해서는, grep을 통해 출력을 파이핑하고 단어를 필터링합니다:
- history | grep echo
명령은 번호가 지정되며, 색인을 사용하여 실행할 수 있습니다:
- !2
마지막에 사용한 명령을 실행하기 위해서는:
- !!
내역 내의 모든 명령을 제거합니다:
- history -c
내역에 대한 현재 설정을 보여줍니다:
- echo $HISTCONTROL
Keyboard shortcuts
bash에는 명령 행에서 입력을 쉽게 편집할 수 있는 두 가지 키보드 단축키 모드인 emacs 모드와 vi 모드가 있습니다. 배쉬 기본은 emacs 모드입니다.
vi mode
vi 모드는 움직임이나 편집에 접두사를 붙이기 위해서 Esc 키를 눌러야 하므로, 이 모드를 배우기에는 조금 어색할 수 있습니다. vi 모드로 모드를 변경하기 위해서는, 다음 명령을 실행하십시오:
- set -o vi
vim 모드의 키 바인딩에 대한 자세한 내용은 vi editing mode cheat sheet 문서를 검토하십시오.
emacs mode
emacs 모드로 전환하기 위해서는(이것이 기본값입니다):
- set -o emacs
이동:
Ctrl+a 줄의 처음(Home)으로 커서를 이동합니다. Ctrl+e 줄의 끝(End)으로 커서를 이동합니다. Ctrl+f 한 문자(글자) 앞으로 커서를 이동합니다. Ctrl+b 한 문자(글자) 뒤로 커서를 이동합니다. Ctrl+xx 현재 위치와 줄의 시작 부분 사이로 커서를 토글.
화면 제어:
Ctrl+S 스크린 출력 멈춤(일시정지). Ctrl+Q 스크린 출력 재시작(위의 명령으로 중지한 후에). Ctrl+L 스크린 비움(clear 명령과 매우 유사함).
Scripts
쉘 스크립트는 특정 쉘 스크립팅 언어로 작성된 프로그램이 들어있는 텍스트 파일입니다. 스크립트에서 명령을 해석하는 데 사용되는 쉘은 첫 번째 행에 정의됩니다(이것을 shebang이라고 부릅니다):
- nano MyScript.sh
#!/bin/bash
echo 'Hello World!'
만약 쉘을 정의하지 않으면, 사용자의 기본 쉘이 스크립트를 실행하는 데 사용됩니다. 때때로 /bin/sh이 사용되는데, 이는 모든 쉘의 아버지이며 기능이 매우 제한적입니다. 거의 모든 쉘은 /bin/sh를 실행할 때 사용되는 명령을 이해하므로, 이 스크립트는 휴대성이 매우 높습니다.
Start scripts
명령-줄에서 직접 스크립트를 실행하기 위해서는, 실행가능이 있어야 합니다. 쉘 스크립트를 실행가능하게 만들기 위해서는:
- chmod +x MyScript.sh
이제 스크립트를 ./ 접두어를 사용해서 실행할 수 있으며, 여기서 스크립트의 shebang로 정의된 쉘 또는 사용자의 기본 쉘이 사용됩니다:
- ./MyScript.sh
다른 방법으로는 명시적으로 쉘을 호출하고 스크립트 filename을 인수로 전달할 수 있습니다(허가권의 변경이 불필요):
- sh MyScript.sh
파일 확장자 .sh는 실행과는 무관하지만, 일반 텍스트 파일과 구별하는데 도움이 됩니다.
Redirection
Bash에서는 한 프로그램의 출력을 파이프를 사용하여 다른 프로그램의 입력으로 재지정할 수 있으며, | 기호로 표시됩니다. 이를 통해 사용자는 명령 체인을 만들 수 있습니다. 아래 예제는 ls -l의 출력을 /usr/bin/less의 입력으로 재지정하는 것입니다:
- ls -l | less
출력을 파일로 재지정하기 위해서는:
- ls -l > ls_l.txt
> 연산자는 새로운 컨텐츠를 추가하기 전에 이전 컨텐츠를 지웁니다. 만약 지우는 것을 원하지 않으면, 연산자 >>(추가)을 대신 사용하십시오.
Logical operators
논리 연산자는 명령 체인과 함께 매우 유용합니다. 이것은 이전 명령이 성공적으로 완료되었는지 여부를 확인하는데 도움이 됩니다.
&& (AND) - 다음 명령은 테스트 스크립트가 성공한 경우에만 'Success'을 인쇄합니다:
- ./MyScript.sh && echo 'Success'
|| (OR) - 다음 명령은 테스트 스크립트가 성공적이지 않은 경우에만 'Failure'를 인쇄합니다:
- ./MyScript.sh || echo 'Failure'
Jobs
일반적으로 스크립트 또는 명령을 시작하면, 명령이 완료될 때까지 입력이 차단됩니다. 백그라운드에서 직접 프로그램을 시작하면, 쉘에서 계속 작업을 할 수 있습니다:
- sh MyScript.sh &
그러면 스크립트가 job 번호 1로 실행되고, 프롬프트는 다음 입력을 기다립니다.
만약 프로그램이 이미 실행 중이고 쉘에서 어떤 작업을 해야 하는 경우에는, 프로그램을 "foreground"에서 "background"으로 또는 그 반대로 이동할 수 있습니다. 만약 명령이 쉘에서 동작중이면 명령 프롬프트를 얻기 위해서, Ctrl+Z 사용하여 명령을 sleep 상태로 놓고, background로 옮기십시오:
- bg %1
background에서 동작중인 모든 job 목록을 얻기 위해서는:
- jobs
job을 foreground로 되돌리기 위해서는:
- fg %1
Command substitution
명령 대체를 사용하면, 다음과 같은 다른 명령의 매개 변수로 프로그램을 실행할 수 있습니다.
- emerge $(qlist -CI x11-drivers)
그러면 먼저 괄호 안에 명령이 실행되고 emerge의 매개 변수로 출력이 추가됩니다.
다음과 같이 하나의 명령으로 더 많은 대체가 수행될 수 있습니다:
- emerge $(qlist -CI x11-drivers) $(qlist -CI modules)
Troubleshootings
배시 기록 완전히 지우기 위의 historyc -c는 현재 터미널의 명령어 기록을 지웁니다. 만약 현재까지 사용자가 사용해 온 전체 명령어 내역을 완전히 제거하려면, 기록 파일 자체를 완전히 비워버릴 수 있습니다:
- echo "$HISTFILE"
- echo ' ' > /home/user/.bash_history
External resources
- Bash reference from the Gentoo Developer's Handbook.
- Advanced Bash-Scripting Guide
- Chet's Bash page
- Official Bash documentation
- The Bash FAQ and Bash guide on Greg Wooledge's wiki
- bash-hackers wiki (very good reference)
- Bash cgit
- POSIX sh spec
- mksh, ksh93, and ksh88 manuals for cross-reference
- Comprehensive Beginner Linux Tutorial