분류 기타

Bash 쉘

컨텐츠 정보

  • 조회 173 (작성일 )

본문

Bash 쉘에 대한 사용자 소개


Bash는 2019 년 현재 Linux, macOS 및 Windows 10의 WSL과 대부분의 시스템에서 실제로 사용되는 쉘입니다.


Bash를 세계에서 가장 인기 있는 쉘로 만든 역사적 이유가 있습니다. 1989 년 처음 출시되었을 때 기술 세계는 매우 달랐습니다. 당시 UNIX 세계의 대부분의 소프트웨어는 비공개 소스였습니다. 유닉스 자체는 독점적이고 폐쇄적 인 소스였습니다.


UNIX 시스템을 사용하려면 쉘을 사용해야 했습니다.


당시 가장 인기 있는 쉘은 비공개 소스였으며 독점적이었습니다. /bin/sh 명령에서 사용 가능한 Bourne 쉘이었습니다. 제작자는 Steve Bourne이기 때문에“Bourne”이라고 불렸습니다.


그 당시 GNU 프로젝트 (그리고 나중에 리눅스에서)를 가진 Richard Stallman은 오픈 소스 혁명을 시작으로 모든 것에 혁명을 일으키려고 했습니다. GNU 프로젝트에는 쉘이 필요했고 자유 소프트웨어 재단의 도움으로 Bash가 탄생했습니다. Bourne Shell에서 크게 영감을 얻은 Bash는 Bourne-again 쉘을 의미하며 GNU 프로젝트의 주요 구성 요소 중 하나이며 오늘날 우리가 여전히 사용하는 가장 성공적인 소프트웨어 중 하나 일 것입니다.


Bash는 sh를 위해 작성된 모든 스크립트를 실행할 수 있으며 이는 채택을 위한 필수 기능이었으며 초기부터 더 많은 기능을 도입하여 사용자에게 더 나은 경험을 제공했습니다. 그 초기부터 Bash는 많은 개선을 얻었습니다. 이 학습서에서는 가장 인기 있고 유용한 작업에 대해 설명합니다.


Bash의 첫 단계 


Bash는 많은 시스템에서 기본 셸이므로 bash 셸을 시작하기 위해 필요한 것은

  • 서버인 경우 시스템에 로그인
  • 컴퓨터인 경우 터미널을 엽니다.

시작하자마자 프롬프트가 표시됩니다 (보통 $로 끝남).


쉘이 bash를 실행하고 있는지 어떻게 알 수 있습니까? 도움말을 입력하고 Enter를 누르십시오.


Screen%20Shot%202019-01-11%20at%2021.56.27.png 


방금 Bash에게 help 명령을 실행하라고 지시했습니다. 이 명령은 실행 중인 Bash 버전과 사용할 수 있는 명령 목록을 차례로 보여줍니다.


경고 : 내가 가지고 있는 버전을 보시겠습니까? 3.2.57입니다. 이 버전은 macOS에서 제공되는 기본 Bash 버전이며 라이센스 문제에 대한 상위 릴리스는 포함되어 있지 않습니다. 이 Bash 버전은 2014 년입니다. brew install bash를 입력하여 Homebrew를 사용하여 최신 Bash 5.x를 설치하십시오. 


쉘 스크립트 나 고급 작업을 작성하지 않는 한 bash 도움말에 나열된 명령을 사용하지 않는 경우가 종종 있습니다.


일상적인 쉘 사용의 99 %는 폴더를 탐색하고 ls, cd 및 기타 공통 UNIX 유틸리티와 같은 프로그램을 실행합니다.


파일 시스템 탐색 


파일 시스템을 탐색하려면 ls 명령을 사용하십시오. /bin/ls에서 사용할 수 있으며 Bash의 경로 목록에 /bin 폴더가 있으므로 ls를 입력하여 사용할 수 있습니다.


ls는 현재 폴더의 파일을 나열합니다. 일반적으로 시스템에 따라 홈 폴더에서 시작하지만 macOS에서는 /Users 아래에 있습니다. 내 홈 폴더는 /Users/flavio에 있습니다. 이것은 Bash와 관련이 없으며 UNIX 파일 시스템과 관련이 있지만 인수는 겹치며 쉘을 사용한 적이 없다면 알아 두는 것이 좋습니다.


Screen%20Shot%202019-01-11%20at%2022.00.45.png 

다른 폴더로 이동하려면 cd 명령을 사용하고 이동하려는 폴더 이름을 사용하십시오.

cd Documents

cd ..는 상위 폴더로 돌아갑니다.


Bash 구성에 따라 프롬프트 앞에 현재 폴더가 표시됩니다 ($ 기호). 또는 그렇지 않을 수도 있지만 pwd를 입력하고 Enter를 눌러 항상 현재 위치를 알 수 있습니다.


pwd는 * w * orking * d * irectory의 * p * athname을 의미합니다.


명령 줄 편집 


쉘에서 명령을 작성할 때 화살표 키를 사용하여 왼쪽과 오른쪽으로 이동할 수 있습니다. 이것은 쉘 기능입니다. 명령 주위를 이동하고 백 스페이스 버튼을 누르고 명령을 수정할 수 있습니다. Enter 키를 누르면 쉘이 가고 시스템이 명령을 실행하게 합니다.


이는 2019 년 현재 일반적이며 허용되는 동작이지만 초기 UNIX 사용자에게 "아무런 영향을 미쳤을 수도 있습니다.


키보드 조합을 사용하면 화살표 키에 도달하지 않고도 빠르게 편집 할 수 있습니다.

  • 현재 선택된 문자를 삭제하려면 ctrl+d
  • 오른쪽의 캐릭터로 이동 ctrl+f
  • 왼쪽의 캐릭터로 이동 ctrl+b

자동 완성 


파일 시스템을 이동할 때 Bash의 좋은 기능은 자동 완성입니다. cd Doc을 입력하고 Tab 키를 눌러 Bash가 문서를 cd로 자동 완성하도록하십시오. 첫 문자를 여러 개 선택할 수 있는 경우 Bash가 목록을 반환하므로 모호성을 제거하는 데 도움이 되는 몇 가지 문자를 더 입력하고 Tab 키를 다시 눌러 완료 할 수 있습니다.

Screen%20Shot%202019-01-11%20at%2022.07.08.png셸은 파일 이름 뿐만 아니라 명령 이름도 자동 완성 할 수 있습니다.


쉘 명령 


쉘을 사용하여 시스템에서 사용 가능한 명령을 실행할 수 있습니다. 폴더에 파일을 나열하기 위해 명령에 전체 경로 (예 : /bin/ls)를 접두어로 지정할 수 있지만 쉘에는 경로 개념이 있으므로 ls 만 입력하면 대부분의 명령이 있는 위치를 알 수 있습니다 (그리고 폴더를 추가 할 수 있음) 구성 하여 이 경로로).


명령은 인수를 허용합니다. 예를 들어 ls /bin은 /bin 폴더의 모든 파일을 나열합니다.


매개 변수 앞에는 ls -a와 같이 대시가 붙어서 ls에게 숨겨진 파일도 표시하도록 지시합니다. 숨겨진 파일은 일반적으로 점 (.)으로 시작하는 파일 (및 폴더)입니다.


일반적인 쉘 명령 


모든 시스템에는 많은 명령이 사전 설치되어 있으며 Linux / macOS 또는 실행중인 Linux 배포판에 따라 상당히 다릅니다.


그러나 실행할 수 있는 가장 일반적인 셸 명령을 간략하게 정리해 보겠습니다. 그것들은 쉘 자체에서 제공되는 것이 아니라 쉘을 통해 호출 할 수 있는 명령 행 명령입니다.


명령이 무엇인지 모르거나 명령 사용법을 모르는 것처럼 문제가 발생하면 사람을 사용하십시오. 목록에 있는 모든 명령 등에 대한 도움말을 얻을 수 있습니다. 예를 들어 man ls를 실행하십시오.


다음은 파일 시스템 명령입니다.

ls 파일을 나열

cd 폴더를 변경하려면

rm 파일 또는 폴더를 제거하려면

mv 파일을 다른 폴더로 이동하거나 파일 이름을 변경하려면

cp 파일을 복사

pwd 현재 작업 디렉토리를 보여주기 위해

mkdir 폴더를 만들려면


유닉스 파일 시스템의 모든 파일은 권한을 가지고 있습니다. chmod를 사용하면 그것들을 변경할 수 있고 (지금 들어 가지 않음) chown을 사용하면 파일 소유자를 변경할 수 있습니다.


cat, tail 및 grep은 파일 작업에 유용한 두 가지 유용한 명령입니다. 나는 곧 그들 각각을 위해 헌신적 인 기사를 만들 것이다.


pico, nano, vim 및 emacs는 일반적으로 설치되는 편집기입니다.


macOS의 whereis는 시스템에서 명령이 있는 위치를 보여줍니다.


물론 더 많은 명령이 있지만 더 자주 실행할 수 있는 명령이 몇 가지 있습니다.


명령 실행 


ls와 cd는 /bin 폴더에 있는 명령입니다. /bin/pwd와 같이 전체 경로를 입력하여 실행 파일 인 경우 모든 파일을 실행할 수 있습니다. 명령은 /bin 폴더에 있을 필요는 없으며 ./ 경로 표시기를 사용하여 현재 폴더에 있는 실행 파일을 실행할 수 있습니다.


예를 들어 /Users/flavio/scripts 폴더에 runme 파일이 있으면 다음을 실행할 수 있습니다.

cd /Users/flavio/scripts

그런 다음 ./runme을 실행하여 실행하십시오.


또는 현재 폴더가 어디에 있든지 Bash에서 /Users/flavio/scripts/runme을 실행할 수 있습니다.


Jobs 


명령을 실행할 때마다 오랫동안 실행되는 프로그램 인 경우 해당 명령이 쉘을 완전히 소유하게 됩니다. ctrl-C를 사용하여 명령을 종료 할 수 있습니다.


언제든지 작업을 실행하여 실행중인 작업과 해당 상태를 볼 수 있습니다.

$ jobs
Job	Group	State	Command
1	72292	stopped	ftp

또 다른 유용한 명령은 실행 중인 프로세스를 나열하는 ps입니다.

$ ps
  PID TTY           TIME CMD
19808 ttys000    0:00.56 /usr/local/bin/fish -l
65183 ttys001    0:04.34 -fish
72292 ttys001    0:00.01 ftp

top은 시스템에서 사용 중인 프로세스와 리소스를 보여줍니다.


kill <PID>를 사용하여 작업 또는 프로세스를 종료 할 수 있습니다.


명령 내역 


위쪽 화살표 키를 누르면 입력 한 명령의 기록이 표시됩니다. 다시, 이것은 쉘 기능입니다. 아래쪽 화살표 키를 누르면 시간을 앞뒤로 탐색하여 이전에 입력 한 명령을 확인할 수 있으며 enter를 누르면 해당 명령을 다시 실행할 수 있습니다.


명령 내역에 빠르게 액세스 할 수 있습니다. history 명령을 실행하면 쉘에 입력 된 모든 명령이 표시됩니다.

Screen%20Shot%202019-01-12%20at%2009.02.20.png 

명령 입력을 시작하면 Bash는 기록에서 이전에 입력 한 명령을 참조하여 자동 완성 할 수 있습니다. esc를 누른 다음 탭을 눌러보십시오.


솔직히 말해서 이것의 Fish shell 구현이 훨씬 더 좋고 쉽다는 것을 알았습니다. 


기본 쉘 설정 


배쉬 외에 더 많은 껍질이 있습니다. Fish, ZSH, TCSH 등이 있습니다. 시스템의 모든 사용자는 자체 쉘을 선택할 수 있습니다.


chsh -s chsh -s /bin/bash 명령을 실행하여 기본 로그인 쉘을 설정하십시오. 예를 들어 Fish와 같이 이전에 변경되지 않았다면 거의 그렇게 할 필요가 없습니다.

chsh -s /usr/local/bin/fish


Bash 커스터마이징 


나는 Bash 프롬프트에서 현재 작업 디렉토리를 볼 수도 있고 그렇지 않을 수도 있다고 언급했다. 이것은 어디에서 결정됩니까? 배쉬 구성에서!


Bash는 시나리오마다 다른 구성 파일을 사용하고 여러 구성 파일을 읽기 때문에 약간의 혼란이 있습니다.


이 혼란에 대한 명령을 드리겠습니다. 먼저 Bash가 로그인 셸로 초기화되는지 여부는 큰 차이가 있습니다. 로그인 쉘은 시스템이 GUI (Graphical User Interface)를 실행하지 않고 쉘을 통해 시스템에 로그인 함을 의미합니다. 예를 들어 서버의 경우입니다.


이 경우 Bash는 다음 구성 파일을 로드합니다.

/etc/profile

그런 다음 사용자 홈 폴더를 찾고 찾은 첫 번째 파일을 순서대로 실행하여 다음 파일 중 하나를 찾습니다.

~/.bash_profile
~/.bash_login
~/.profile

~는 홈 폴더를 의미합니다 (Bash에서 자동으로 번역 함).


이는 .bash_profile이 있으면 .bash_profile에서 명시 적으로 실행되지 않는 한 ~ / .bash_login 및 ~ / .profile이 실행되지 않습니다.


로그인 쉘 대신 일반 응용 프로그램과 같이 macOS에서와 같이 Bash를 실행하면 구성 파일이 변경됩니다. Bash는 먼저 /etc/bash.bashrc를 로드 한 다음 ~ / .bashrc를 로드 합니다.


환경 변수 


때로는 환경 변수를 사용하는 프로그램이 있습니다. 이는 프로그램 외부에서 설정할 수 있고 프로그램 자체의 실행을 변경할 수 있는 값입니다. 예를 들어 API 키. 또는 파일 이름.


구문을 사용하여 환경 변수를 설정할 수 있습니다

VARIABLE_NAME=variable_value

따옴표를 사용하여 값에 공백이 포함될 수 있습니다.

VARIABLE_NAME="variable value"


bash 스크립트는 달러 기호 앞에 $VARIABLE_NAME을 붙여 이 값을 사용할 수 있습니다.


또한 다른 프로그래밍 언어 명령은 환경 변수를 사용할 수 있습니다 (예 : Node.js로 환경 변수를 읽는 방법).


시스템은 다음과 같은 환경 변수를 설정합니다.

  • $HOME 홈 폴더
  • $LOGNAME 귀하의 사용자 이름
  • $SHELL 기본 쉘의 경로
  • $PATH 쉘이 명령을 찾는 경로

echo를 앞에 붙여서 값을 검사 할 수 있습니다.

echo $LOGNAME # flavio
echo $HOME # /Users/flavio


특수 환경 변수 : $PATH 


나는 $PATH 변수를 언급했다. 이것은 명령을 입력 할 때 쉘이 조사 할 폴더 목록입니다. 폴더는 콜론으로 구분되며 순서대로 작성됩니다. Bash는 먼저 찾은 다음 요청한 명령을 검색하고 찾은 경우 실행합니다. 그렇지 않으면 다음 폴더로 이동합니다.

bash-5.0$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin

일반적으로 ~ / .bashrc 파일에서 항목을 추가하거나 추가하여 이를 편집합니다.

PATH = "$PATH:/Users/flavio/bin"


Aliases 


별칭을 사용하여 일반적인 명령에 대한 바로 가기를 설정할 수 있습니다. 예를 들어 복잡한 매개 변수 조합에 빠른 이름을 지정할 수 있습니다.


구문을 사용하여 별명을 정의하십시오.

alias <alias>=<command>


명령에 공백이 있으면 따옴표를 사용하십시오.

alias <alias>="<command>"


시스템에 일반적으로 추가하는 별칭은 ll입니다.

alias ll="ls --al"

~ / .bashrc 파일에서 일반적으로 별칭을 정의합니다.


명령에 변수가 있는 경우 따옴표에주의하십시오. 큰 따옴표를 사용하면 변수가 정의 시간에 해석되고 작은 따옴표를 사용하여 호출시 해석됩니다. 그 2는 다릅니다 :

alias lsthis="ls $PWD"
alias lscurrent='ls $PWD'

$PWD는 쉘이 있는 현재 폴더를 나타냅니다. 이제 새 폴더로 이동하면 lscurrent는 새 폴더에 파일을 나열하고 lsthis는 별명을 정의 할 때 있던 폴더에 파일을 계속 나열합니다.


고급 명령 줄 기능 


Wildcards 


ls 및 기타 여러 명령은 와일드 카드를 잘 활용할 수 있습니다. 이미지로 시작하는 모든 파일을 나열 할 수 있습니다.

ls image*


또는 이미지로 끝나는 모든 파일 :

ls *image


또는 이름 안에 이미지가 포함 된 모든 파일 :

ls *image*


Redirecting output and standard error error 


기본적으로 쉘에서 시작된 명령은 출력과 오류를 모두 쉘로 다시 인쇄합니다. 이것은 당신이 원하는 것이 아닐 수도 있습니다. 대신 출력을 파일에 쓰도록 결정할 수 있습니다.


실제로 유닉스에서는 화면조차도 파일로 간주되기 때문에 / different 파일 /에 대해. 특히,

  • 0 표준 입력을 식별합니다
  • 1 표준 출력을 식별합니다
  • 2 표준 오류를 식별합니다

명령 뒤에 1>을 추가 한 다음 파일 이름을 추가하여 표준 출력을 파일로 리디렉션 할 수 있습니다.


동일한 기술을 사용하여 2>를 사용하여 표준 오류를 리디렉션 할 수 있습니다.


꽤 많이 사용되기 때문에 1>에 대한 바로 가기가 있습니다.

ls 1> list.txt 2> error.txt
ls > list.txt 2> error.txt

또 다른 바로 가기 (&>)는 / both / 표준 출력 및 표준 오류를 파일로 리디렉션합니다.

ls &> output.txt


또 다른 빈도는 2> & 1을 사용하여 표준 오류를 표준 출력으로 리디렉션하는 것입니다.


백그라운드에서 명령 실행 


&를 추가하여 쉘을 제어하지 않고 백그라운드에서 프로그램을 실행하도록 Bash에 지시 할 수 있습니다.

top &

top은 대부분의 리소스 소비 순서대로 실행 중인 프로세스를 나열하는 명령입니다. 


일반적으로 쉘을 제어하는 ​​응용 프로그램이 시작되었지만 아무 일도 일어나지 않는 것 같습니다. fg (일명 * f * ore * g * round)를 입력하여 초점을 다시 맞출 수 있지만 이제는 큰 주제 인 프로세스 및 작업 영역에 들어가지만 빠른 개요는 다음과 같습니다.


명령이 실행 중이면 ctrl-Z를 사용하여 명령을 일시 중지하고 배경으로 가져올 수 있습니다. 쉘이 다시 포 그라운드로 돌아 오면 이제 bg를 실행하여 이전에 일시 정지 된 작업의 재개 실행을 이동할 수 있습니다.


다시 돌아갈 준비가 되면 fg를 실행하여 해당 프로그램을 포 그라운드로 되돌립니다.


ps를 사용하여 실행 중인 모든 프로세스를 볼 수 있으며 목록에는 모든 프로세스 pid 번호가 표시됩니다. 일시 정지 된 프로세스 pid를 사용하면 특정 명령 (예 : fg 72292)을 포 그라운드로 가져올 수 있습니다. bg와 동일하게 작동합니다.


큐잉 명령 


Bash가 명령을 세미콜론으로 분리하여 다른 종료 후 바로 실행하도록 지시 할 수 있습니다.

cd /bin; ls


같은 줄에 여러 명령을 대기 시키기 위해 이것을 반복 할 수 있습니다.


출력 리디렉션 


프로그램은 <연산자를 사용하여 모든 파일에서 입력을 수신하고> 연산자를 사용하여 출력을 파일에 저장할 수 있습니다.

echo hello > result.txt
wc < result.txt


wc는 입력으로 받는 단어를 세는 명령입니다.


Pipe 


파이프를 사용하면 모든 명령 출력을 두 번째 명령의 입력으로 사용할 수 있습니다. | 연산자를 사용하여 두 가지를 결합하십시오. 이 예에서 wc는 echo hello의 출력에서 ​​입력을 가져옵니다.

echo hello | wc


그룹화 명령 


"&"를 사용하여 두 명령을 결합하려면 &&를 사용하십시오. 첫 번째 명령이 문제 없이 실행되면 두 번째 명령 등을 실행하십시오.


사용 || "또는"를 사용하여 두 명령을 결합합니다. 첫 번째 명령이 문제 없이 실행되면 두 번째 명령이 실행되지 않습니다.


! 다음 논리 연산을 무효화합니다.

$ echo hello && echo test
hello
test
$ echo hello || echo test
hello
$ ! echo hello || echo test
hello
test


괄호를 사용하여 혼동을 피하고 우선 순위를 변경하기 위해 표현식을 결합 할 수 있습니다.

$ ! (echo hello) || (echo test)
hello
test
$ ! (echo hello || echo test)
hello


프로그래밍 쉘 


Bash와 같은 쉘의 가장 좋은 기능 중 하나는 기본적으로 명령 실행을 자동화하여 프로그램을 만들 수 있다는 것입니다.


곧 Bash 스크립팅에 대한 별도의 가이드를 작성하려고 합니다.이 가이드와는 별도의 이 가이드와 별도로이 주제가 이 입문 Bash 가이드에 추가하려는 내용보다 더 깊이 있기 때문입니다.


빠른 소개 : 스크립트는 한 줄에 하나씩 셸 스크립트 (및 필요한 셸)임을 나타내는 줄로 시작하는 텍스트 파일입니다. 

예:

#!/bin/bash
ls


이것을 myscript 파일로 저장하고 chmod + x myscript를 사용하여 실행 가능하게 하고 ./myscript를 사용하여 실행할 수 있습니다 (./는“현재 폴더”를 의미 함).


쉘 스크립팅은 이 글의 범위를 벗어나지 만 이것에 대해 알고 싶습니다. 스크립트는 제어 구조와 다른 많은 멋진 것들을 가질 수 있습니다.


이 동일한 스크립팅 전략은 Zsh와 같은 다른 쉘에도 적용됩니다.


#!/bin/zsh
ls