유닉스 쉘(Unix Shell)

파일과 디렉토리

학습 목표

  • 파일과 디렉토리의 차이점과 유사점을 설명한다.
  • 절대경로를 상대경로로 변환하고, 반대로 상대경로를 절대경로로 변환한다.
  • 특정 파일과 디렉토리를 식별할 수 있는 절대경로와 상대경로를 구성한다.
  • 쉘의 읽기-실행-출력(read-run-print) 주기를 각 단계별로 설명한다.
  • 명령-라인 호출에서 실제 명령어, 플래그, 파일명을 식별한다.
  • 탭 완성기능을 시연하고, 장점을 설명한다.

파일과 디렉토리 관리를 담당하고 있는 운영체제 부분을 파일 시스템(file system)이라고 한다. 파일 시스템은 데이터를 정보를 담고 있는 파일과 파일 혹은 다른 디렉토리를 담고 있는 디렉토리(혹은 “폴더”“)로 조직화한다.

파일과 디렉토리를 생성, 검사, 이름 바꾸기, 삭제하는데 명령어 몇개가 자주 사용된다. 명령어를 살펴보기 위해, 쉘 윈도우를 연다:

$

달러 기호 ($)는 프롬프트(prompt)로 쉘이 입력을 기다리는 것을 보여준다; 프롬프트로 여러분 컴퓨터 쉘은 다른 문자가 될 수 있고, 프롬프트 이전에 부가적인 정보가 보여질 수도 있다. 이번 학습 혹은 다른 학습에 나온 명령어를 타이핑할 때, 프롬프트는 타이핑하지 말고, 뒤에 따라 나오는 명령어만 타이핑한다.

whoami 명령어를 타이핑하고, 명령을 쉘에 보내기 위해서 엔터키(Enter Key, 종종 키보드에 따라 Return으로 표기도 됨)를 누룹니다. 명령어에 대한 출력은 현재 사용자의 ID가 됩니다. 즉, 쉘이 생각하는 사용자가 누구인지를 보여준다:

$ whoami
nelle

좀더 구체적으로, whoami를 타이핑할 때, 쉘은

  1. whoami 라는 프로그램을 찾고,
  2. 프로그램을 실행하고,
  3. 프로그램 실행 결과를 출력하고,
  4. 새로운 프롬프트를 화면에 출력해서 더 많은 명령어를 받을 준비가 되어 있음을 알려준다.

다음으로, pwd 명령어를 실행하여 지금 어느 위치에 있는지 알아본다. pwd는 “print working directory”의 첫 글자를 땄다. 언제든지, 현재 작업 디렉토리(current working directory)는 현재 기본디폴트 디렉토리가 된다. 즉, 명시적으로 다른 곳으로 지정하지 않았다면, 사용자가 명령어를 실행하는 디렉토리가 컴퓨터가 가정하는 디렉토리가 된다. 다음에서, 컴퓨터의 응답은 /Users/nelle으로 넬(Nelle)의 홈 디렉토리(home directory)다:

$ pwd
/Users/nelle

“홈 디렉토리(home directory)”를 이해하기 위해서, 파일 시스템이 전체적으로 어떻게 구성되었는지 살펴보자. 최상단에 다른 모든 것을 담고 있는 루트 디렉토리(root directory)가 있다. 슬래쉬 / 문자로 나타내고, /users/nelle에서 맨 앞에 슬래쉬이기도 하다.

홈 디렉토리 안쪽에 몇가지 다른 디렉토리가 있다: bin (몇몇 내장 프로그램이 저장된 디렉토리), data (여러가지 데이터 파일이 저장된 디렉토리), users (사용자의 개인 디렉토리가 저장된 디렉토리), tmp (장기간 저장될 필요가 없는 임시 파일을 위한 디렉토리), 등등:

파일 시스템

파일 시스템

현재 작업 디렉토리 /Users/nelle/Users 내부에 저장되어 있다는 것을 알고 있는데, 이유는 /Users가 이름 처음 부분이기 때문에 알 수 있다. 마찬가지로 /Users는 루트 디렉토리 내부에 저장되어 있다는 것을 알 수 있는데, 이름이 /으로 시작되기 때문이다.

/Users 하단에, 컴퓨터 계정으로 각 사용자별 디렉토리를 볼 수 있다. 미이라(Mummy) 파일은 /Users/imhotep 디렉토리에 저장되어 있고, 늑대인가(Wolfman)의 파일은 /Users/larry 디렉토리에 저장되어 있고 /Users/nelle 디렉토리에 nelle의 정보가 저장되어 있는데, 이것이 왜 nelle이 디렉토리 이름의 마지막 부분인 이유다.

홈 디렉토리

홈 디렉토리

Nelle의 홈 디렉토리에 무엇이 있는지 ls 명령어를 실행해서 살펴보자. ls는 “목록보기(listing)”를 나타낸다:

$ ls
creatures  molecules           pizza.cfg
data       north-pacific-gyre  solar.pdf
Desktop    notes.txt           writing
Nelle의 홈 디렉토리

Nelle의 홈 디렉토리

ls는 알파벳 순서로 깔끔하게 열로 정렬하여 현재 디렉토리에 있는 파일과 디렉토리 이름을 출력한다. 플래그(flag) -F를 추가하여 출력을 좀더 이해하기 좋게 생성할 수 있다. ls으로 하여금 디렉토리 이름 뒤에 /을 추가하게 일러준다:

$ ls -F
creatures/  molecules/           pizza.cfg
data/       north-pacific-gyre/  solar.pdf
Desktop/    notes.txt            writing/

/Users/nelle 디렉토리에는 7개의 서브 디렉토리(sub-directories)가 담겨 있다. 뒤에 슬래쉬를 갖지 않은 이름, 예를 들어 notes.txt, pizza.cfg, solar.pdf는 단순한 파일이다. ls-F 사이에 공백이 있음에 주목한다. 공백이 없으면 쉘은 존재하지 않는 ls-F 명령어를 실행한다고 생각한다.

이제 ls -F data(즉, 명령어 ls인자(arguments) -Fdata)를 실행하여 Nelle의 data 디렉토리에 무엇이 있는지 살펴보자. ls 명령어의 앞에 대쉬(‘-’)가 없는 두번째 인자는 현재 디렉토리 이외의 목록을 보고자 한다고 것을 나타낸다:

$ ls -F data
amino-acids.txt   elements/     pdb/            salmon.txt
animals.txt       morse.txt     planets.txt     sunspot.txt

명령어 실행결과는 텍스트 파일 4개와 하위 디렉토리가 두개 있다는 것을 보여준다. 이런 방식으로 계층적으로 조직하여 관리하는 것이 작업을 체계적으로 추적할 수 있게 도움을 준다: 홈 디렉토리에 파일 수백개를 놓는 것도 가능하다. 하지만, 마치 책상위에 종이 수백장을 쌓아 놓는 것과 유사해서, 이런 전략은 본인을 파멸로 이끌 수도 있다.

그런데 data 디렉토리 이름을 적은 것에 주목한다. 끝에 슬래쉬가 없습니다. -F 플래그를 사용해서 파일과 디렉토리를 구별했을 때, 사용한 ls 명령어에 디렉토리 이름 뒤에 붙었다. 그리고 상대 경로(relative path)이기 때문에 슬래쉬로 시작도 하지 않았다. 즉, ls에게 파일의 루트에서가 아닌 현재 위치에서 찾으라고 한다.

ls -F /data를 실행(슬래쉬가 앞에 있음)하면, 다른 답을 얻게 되는데, 왜냐하면 /data절대 경로(absolute path)이기 때문이다:

$ ls -F /data
access.log    backup/    hardware.cfg
network.cfg

앞의 / 슬래쉬는 컴퓨터에게 파일 시스템의 루트 경로를 따르게 명령한다. 그래서 상기 명령어를 실행할 때, 어느 위치에 있는지 관계없이 항상 정확하게 한 디렉토리만을 참조한다.

현재 작업 디렉토를 바꾸려고 하면 어떨까요? 작업 디렉토리를 변경하기 전에 pwd 명령어가 현재 /Users/nelle에 있다고 보여주고, 인자가 없는 ls 명령어는 디렉토리의 내용을 보여준다:

$ pwd
/Users/nelle
$ ls
creatures  molecules           pizza.cfg
data       north-pacific-gyre  solar.pdf
Desktop    notes.txt           writing

작업 디렉토리를 변경하기 위해서 cd 다음에 디렉토리 이름을 사용한다. cd는 “change directory”의 두문어다. 하지만 약간 오해의 소지가 있다: 명령어 자체가 디렉토리를 변경하지는 않고, 단지 사용자가 어느 디렉토리에 있는지에 대한 쉘의 생각만 바꾼다.

$ cd data

cd는 어떤 것도 출력하지 않지만, cd명령어 다음에 pwd를 실행하면, /Users/nelle/data 디렉토리에 있음을 확인할 수 있다. ls 명령어를 실행하면, /Users/nelle/data 디렉토리 내용을 볼 수 있다. 왜냐하면 이 디렉토리가 현재 사용자가 있는 디렉토리이기 때문이다:

$ pwd
/Users/nelle/data
$ ls -F
amino-acids.txt   elements/     pdb/            salmon.txt
animals.txt       morse.txt     planets.txt     sunspot.txt

이제 디렉토리를 따라 아래로 어떻게 갈 수 있는지를 알게되었다. 어떻게 상위 디렉토리로 갈 수 있을까요? 절대 경로를 사용할 수 있습니다:

$ cd /Users/nelle

하지만, 상위 디렉토리로 가기 위해서는 cd .. 명령어를 사용하는 것이 거의 항상 더 간단하다:

$ pwd
/Users/nelle/data
$ cd ..

..은 특수 디렉토리 이름으로 “이것을 포함하는 디렉토리”를 의미한다. 좀더 간단하게 현재 디렉토리의 부모(parent)를 지칭한다. 당연하지만, cd .. 다음에 pwd을 실행하면, 다시 /Users/nelle로 돌아온다:

$ pwd
/Users/nelle

ls 명령어를 실행할 때 특수 디렉토리 ..는 보통 화면에 보여지지 않는다. 만약 화면에 출력하고자 한다면, ls 다음에 -a 플래그를 줄 수 있다:

$ ls -F -a
./                  creatures/          notes.txt
../                 data/               pizza.cfg
.bash_profile       molecules/          solar.pdf
Desktop/            north-pacific-gyre/ writing/

-a은 “모두 보여주기(show all)”를 나타낸다: ls명령어로 ..처럼 .로 시작하는 디렉토리와 파일을 보여준다. ..은 만약 /Users/nelle에 위치하고 있다면, /Users을 나타낸다. .은 “현재 작업 디렉토리”를 의미하는 또다른 특수 디렉토리를 보여준다. 좀 중복스럽게 보이지만, 곧 어떻게 사용되는지 알게 될 것이다.

마지막으로, .bash_profile 파일도 볼 수 있다. 이 파일에는 통상 쉘(터미널)을 사용자 환경에 맞춘 환경설정정보를 담겨 있다. 이번 학습 교재에 어떤 환경설정 사항도 담겨있지 않다. .bashrc 혹은 .bash_login로 불리는 유사한 파일도 있다. 접두어 .을 사용해서 표준 ls명령어를 사용할 때, 환경설정 파일이 터미널을 난잡하게 어지르는 것을 방지하도록 한다.

Nelle의 파이프라인: 파일 구성하기

파일과 디렉토리에 대해서 알았으니, Nelle은 단백질 분석기가 생성하는 파일을 구성할 준비를 마쳤다. 우선 north-pacific-gyre 디렉토리를 생성해서 데이터가 어디에서 왔는지를 상기하도록 한다. 2012-07-03 디렉토리를 생성해서 시료 처리를 시작한 날짜를 명기한다. conference-paperrevised-results같은 이름을 사용하곤 했다. 하지만, 몇년이 지난 후에 이해하기 어렵다는 것을 발견했다. (마지막 지푸라기는 revised-revised-results-3 디렉토리를 본인이 생성했다는 것을 발견했을 때였다.)

각각의 물리적 시료는 “NENE01729A”처럼 10자리 중복되지 않는 ID로 연구실 관례에 따라 표식을 붙였다. 시료의 장소, 시간, 깊이, 그리고 다른 특징을 기록하기 위해서 수집 기록에 사용된 것과 동일하다. 그래서 이를 각 파일 이름으로 사용하기로 결정했다. 분석기 출력값이 텍스트 형식이기 때문에 NENE01729A.txt, NENE01812A.txt, … 같이 확장자를 붙였다. 1520개 파일 모두 동일한 디렉토리에 저장되었다.

홈 디렉토리에서 Nelle은 다음 명령어 무슨 파일이 있는지 확인할 수 있다:

$ ls north-pacific-gyre/2012-07-03/

엄청나게 많은 타이핑이지만 탭 자동완성(tab completion)을 통해 쉘에게 많은 일을 시킬 수도 있다. 만약 다음과 같이 타이핑하고:

$ ls nor

그리고 나서 탭(키보드에 탭 키)을 누르면, 자동으로 쉘이 디렉토리 이름을 자동완성한다:

$ ls north-pacific-gyre/

탭을 다시 누르면, Bash가 명령문에 2012-07-03/을 추가하는데, 왜냐하면 유일하게 가능한 자동완성조건이기 때문이다. 한번더 탭을 누려면 아무것도 수행하지 않는다. 왜냐하면 1520가지 경우의 수가 있기 때문이다; 탭을 두번 누르면 모든 파일 목록을 가져온다. 이것을 탭 자동완성(tab completion)이라고 부르고, 앞으로도 다른 많은 툴에서도 많이 볼 것이다.

도전과제 질문에 사용되는 파일 시스템

도전과제 질문에 사용되는 파일 시스템

상대경로 해결

만약 pwd 명령어를 쳤을 때, 화면에 /Users/thing이 출력된다면, ls ../backup은 무엇을 출력할까요?

  1. ../backup: No such file or directory
  2. 2012-12-01 2013-01-08 2013-01-27
  3. 2012-12-01/ 2013-01-08/ 2013-01-27/
  4. original pnas_final pnas_sub

동일 작업을 수행하는 수많은 방법 - 절대 경로 vs. 상대 경로

/home/amanda/data/ 가상 파일 시스템 경로에 대해서, Amanda가 홈디렉토리인 /home/amanda로 돌아가도록 사용할 수 있는 명령어를 아래에서 선택하시요.

  1. cd .
  2. cd /
  3. cd /home/amanda
  4. cd ../..
  5. cd ~
  6. cd home
  7. cd ~/data/..
  8. cd
  9. cd ..

ls 독해 능력

상기 그림(도전과제 질문에 사용되는 파일 시스템)에 나온 디렉토리 구조를 상정한다. 만약 pwd 명령어를 쳤을 때 화면에 /Users/backup이 출력되고, -r 인자는 ls 명령어가 역순으로 화면에 출력하게 한다면, 어떤 명령어가 다음을 화면에 출력할까요?> ~ pnas_sub/ pnas_final/ original/ ~

  1. ls pwd
  2. ls -r -F
  3. ls -r -F /Users/backup
  4. 위 #2 혹은 #3, 하지만, #1은 아님.

기본디폴트 cd 행동

디렉토리 이름없는 cd 명령어는 무엇을 수행할까요?

  1. 아무 것도 하지 않는다.
  2. 작업 디렉토리를 루트 /로 변경한다.
  3. 작업 디렉토리를 사용자의 홈 디렉토리로 변경한다.
  4. 오류 메시지를 출력한다.

더 많은 ls 인자 탐색하기

ls 명령어가 -s-h 을 인자로 사용되면 무슨 작업을 수행할까요?