Software Carpenty의 The Unix Shell 강좌 내용을 정리했습니다. 모든 내용과 이미지는 해당 강좌에서 발췌하였습니다.
컴퓨터와 인간의 상호작용
쉘 = 사용자가 명령어를 입력할 수 있는 프로그램
pwd : print working directory
/ : 첫글자로 오는 경우 root, 경로 중간에 사용되면 seperator를 의미
ls : 현재 directory의 내용물을 표시
-F
: 마커로 이해하기 쉽게 분류함-R
: 모든 하위 경로를 계속해서 표시함(Recursively)-l
: 권한, 소유자, 크기, 수정시간 등의 추가적인 정보까지 포함하여 목록으로 나열(long listing format)-h
: -l
과 함께 사용되며 크기를 문자 접미사로 표시(human readable)-t
: 알파벳순 대신 최근 수정된 순으로 나열-r
: reverse order-a
: show all
./
: 현재 디렉토리
../
: 상위 디렉토리
clear : 윈도우와는 다르게 스크롤하면 이전 화면이 남아있음
man : Linux/Mac의 내장 명령어 메뉴얼
cd
: change directory, 경로 이동에 사용~
: home으로 해석됨, 경로 첫번째 자리에서만 동작함-
: 이전 경로로 해석됨-
: short options, 쉘에 직접 입력할때 주로 사용--
: long options, 스크립트에서 주로 사용인자 없는 옵션의 단독 호출을 switch, flag라고 부름
각각의 부분은 공백으로 구분됨, 대문자 구분
Tab
: 쉘에서 입력중 Tab키를 누르면 자동완성(tab completion), 두번 누르면 검색결과 표시-p
: 공백으로 구분된 인자에 대하여 하위경로(nested subdirectory)를 포함하여 생성$ mkdir -p /a/b /c/d
)파일과 디렉토리를 위한 좋은 네이밍
- 공백을 사용하지 말 것.
- 공백은 인자들을 구분할때 사용되므로 오류가 발생할 수 있음
- 공백 대신 -/_를 사용
- 대쉬로 시작하지 말 것.
- 옵션으로 해석되기 때문
- 되도록이면 알파벳, 숫자,
.
,-
,_
만 사용할 것.
- 특수문자들은 특별한 의미를 가지고 있는 경우가 많음
- 예키지 않은 동작을 초래할 수 있음
- 특수문자나 공백을 사용하려면 전체를
""
로 감싸줄 것
$ nano draft.txt
$ touch draft.txt
도 존재하지 않는 파일을 생성함Filename extensions
something.extension
파일이 어떤 종류의 데이터를 담고 있는지 사람 혹은 프로그램에게 알려주는 convention.
파일은 2진수만을 담고 있고 그것을 해석하는 규칙들이 다양한 것이다.
확장자는 아무것도 보증하지 않음.
$ mv thesis/draft.txt thesis/quotes.txt
이름까지 지정 → rename-i
: interactive, 겹치거나 할 경우 물어봄-r
: recursive, 하위의 모든 내용물을 복사함-i
: interactive, 지우기 전 확인-r
: rm은 파일에 대해서만 동작하지만 재귀옵션으로 내용물을 포함한 하위 디렉토리를 모두 지울 수 있음와일드카드
* : 하나 이상의 문자(문자가 없을 수 있음)
? : 하나의 문자(항상 문자가 있음)
$ wc -l *.pdb > lengths.txt
pdb (protein data bank format)
>
: redirect, 명령어의 실행 결과를 파일로 출력, 파일이 없으면 생성, 있으면 덮어씀.
cat : concatenate(연관시키다), 파일의 내용을 출력함, 다수의 파일 → 덧붙임/병합
less : 파일의 내용을 스크롤, 검색 가능한 뷰어를 통해 큰 화면으로 출력
sort : alphanumerical순으로 정렬(아스키코드), 파일에 영향을 끼치지 않고 결과를 반환.
-n
: numerical, 작은 수부터 head : 파일의 시작부터 일부분을 출력, 내용을 빠르게 확인할 수 있음
-n n
: n번째 줄까지를 출력cut : 파일의 일부를 제거
-d
: delimiter(구획 문자), 구획문자 지정-f
: 구분된 열 지정uniq : 인접한 줄에서 중복된 내용을 제거, 보통 sort와 함께 사용됨
-c
: 항목별로 중복되는 횟수 표시
$ sort -n lengths.txt > lengths.txt
결과를 다시 같은 파일에 저장하는 경우 파일이 손상됨
>
와>>
의 차이$ echo hello > test1.txt $ echo hello >> test2.txt
>
는 파일을 새로 덮어쓰지만>>
는 append, 파일의 끝에 내용이 추가됨
$ sort -n lengths.txt | head -n 1
|
: pipe, 왼쪽 명령어의 결과를 오른쪽 명령어에 인자로 전달함.
정렬을 위한 중간 파일의 필요가 없어져서 효율이 증가
pipe를 합성함수처럼 연속적으로 사용할 수 있음
$ wc -l *.pdb | sort -n | head -n 1
프로그램들을 연결한다는 아이디어 ➡️ 유닉스가 성공한 이유
pipes and filters
프로그래밍 모델
많은 기능을 갖춘 거대한 프로그램보다 심플하고 연동이 잘 되는 여러 개의
작은 프로그램들을 만들기
filter : wc, sort같은 stream 입력을 stream 출력으로 변환시키는 프로그램
거의 모든 유닉스 프로그램은 이런 pipeline으로 작동함
→ 입출력이 standard input, standard output으로 표준화되어있기 때문
→ 이런 설계 철학을 따라야 사용자들도 pipeline을 통해 효율적으로 활용할 수 있음
The best way to use the shell is to use pipes to combine simple single-purpose programs (filters).
shell-lesson-data/exercise-data/creatures
basilisk.dat minotaur.dat unicorn.dat
목표 ➡️ 각 생물의 '문'을 출력
# The word "for" indicates the start of a "For-loop" command
for thing in list_of_things
#The word "do" indicates the start of job execution list
do
# 들여쓰기는 필요없지만 가독성을 높여줌
operation_using/command $thing
# The word "done" indicates the end of a loop
done
for filename in basilisk.dat minotaur.dat unicorn.dat
do
echo $filename
head -n 2 $filename | tail -n 1
done
basilisk.dat
CLASSIFICATION: basiliscus vulgaris
minotaur.dat
CLASSIFICATION: bos hominus
unicorn.dat
CLASSIFICATION: equus monoceros
FOLLOW THE PROMPT
for문을 입력하고 return하면 쉘 프롬프트가$
에서
done을 return 할 때까지>
로 바뀜, 명령어를 마무리하지 않았다는 것을 의미
;
은 한 줄에서 두 명령어를 구분할 때 사용됨
변수 : 루프를 돌며 순차적으로 리스트의 항목이 변수에 할당됨
$
: 쉘 인터프리터가 변수로 해석함history : 최근에 사용한 명령어를 번호로 모두 나열함
!번호
: 명령어를 다시 실행함$ history | tail -n 5
: 가장 최근 것들을 유용하게 표시Ctrl + R : reverse-i-search, 가장 최근의 명령어를 검색할 수 있음
누를 때마다 다음 검색
!!
: 가장 최근의 결과
!$
: 최근에 입력에서 마지막 단어
루프를 사용할때는 한 번에 많은 실수가 발생할 수 있기 때문에
echo로 실행될 명령어를 미리 확인하는 것이 좋음.
*.sh
: 쉘 스크립트, bash로 실행$n
: 쉘 스크립트에서 실행할때 전달받은 n번째 인자$@
: 공백으로 구분된 각각의 모든 인자$*
: 모든 입력이 하나의 인자로 해석됨""
로 감싸서 공백에 대비#
: 주석Bash Alt 단축기 사용하기
터미널 ➡️ 설정 ➡️ 프로파일 ➡️ 키보드 ➡️ Option을 Meta키로
$ history > test.sh
test.sh에는 history > test.sh
가 포함됨
history | head -n | tail -n > recent.sh
쉘 심화자료
Global/Regular Expression/Print
유닉스 에디터들의 공통적인 기능과 동명의 CLI 프로그램
파일에서 패턴을 포함하는 줄을 찾아서 출력함
기본적으로 패턴은 정규표현식을 따름
Options
-w
: whole-word match
-n
: 줄 번호를 표시
-i
: case insensitive, 대소문자 구분안함
-v
: invert, 패턴이 일치하지 않는 줄만 출력
-r
: recursively, 하위 디렉토리까지 모두 탐색
$find /path -options
grep과는 달리 파일 자체를 찾음
find .
: current working directory-type d
: directory only-type f
: file only$find . -name *.txt
: 쉘에 의해 즉시 와일드카드가 expansion되어서 CWD의 텍스트파일만 표시됨""
로 패턴을 묶어주어야 올바른 결과가 나옴
$()
: 쉘이 명령어를 실행하기 전 괄호 내부를 먼저 확장시킴
→ 임의의 명령어를 와일드카드처럼 사용할 수 있음
출처 및 참고
https://swcarpentry.github.io/shell-novice/index.html
https://www.theodinproject.com/lessons/foundations-command-line-basics#assignment