( 파일 실행할때 주는 매개변수가 사용자명이 된다.) 1. who are you? 라고 물으면, 이름 입력받기(read 사용) 2. 사용자 명(apple)이 아니면, Permission Denied로 뜨게하기 3. 사용자 명(apple)이 맞다면, 1) ls –l 한 결과와 컴파일 할 파일을 묻고 입력받는다. 2) 이때, 컴파일 하여 생긴 실행파일(a.out)의 이름을 현재 날짜로 바꾸어주기 (ex. 20200529) ( ls 하여 현재 날짜로 된 실행파일이 있는지 확인하고, 실행해보기)
vi 편집기로 assign1.sh라는 파일에 위와 같은 내용을 입력해준다.
매직넘버를 이용하여 실행할 쉘스크립트를 만들어 준다.
who are you? 라는 질문에 답을 입력하기 위해 read라는 명령어를 이용하고 name이라는 변수에 입력한다.
입력과 출력을 한 행에서 처리하기 위해 -p 옵션을 사용한다.
if문을 이용하여 name 변수에 입력한 값과 매개변수($1=사용자명)에 입력한 값이 같다면
( if문을 쓸 때 괄호([ ])와 비교 연산자(=) 앞뒤에 반드시 공백이 있어야 함을 주의한다. )
파일 상세 정보를 출력하기 위해 ls -l을 해준다.
그리고 컴파일할 파일을 묻고(file to compile) 입력받기 위해 read명령어를 이용한다.
이 때도 위와 같이 -p 옵션을 사용하여 입력과 출력을 한 행에서 처리하고 file이라는 변수에 입력한다.
위에서 입력한 컴파일할 파일을 컴파일하기 위해 gcc를 이용한다.
컴파일하여 생성된 실행파일 a.out의 이름을 현재 날짜로 바꾸어주기 위해 파일명을 변경해주는 명령어인 mv를 이용한다.
이 때, date라는 명령어를 통해 현재 날짜와 시간으로 변경되도록 했고 (Y:연도, m:월, d:일)
date+포맷을 입력할 때 +와 포맷 사이에 공백이 없어야 함을 주의해야 한다.
또한, 컴파일이 성공되었다는 메세지(Success to compile)가 출력되도록 echo 명령어를 이용한다.
만약 name 변수에 입력한 값과 매개변수($1=사용자명)에 입력한 값이 다르다면 (=else)
Permission denied라는 메세지가 출력되게 하기 위해 echo를 이용한다.
위와 같은 내용을 모두 입력하고 vi 편집기를 저장 후 종료한다.
chmod를 이용하여 assign1.sh 파일에 실행 권한을 부여해준다.
apple을 매개변수로 하여 assign1.sh 파일을 실행시킨 후 who are you?라는 질문에 apple과 다른 swing을 입력해주면
permission denied라는 메세지가 잘 출력되는 것을 확인할 수 있다.
( 이와 같이 출력되는 이유는 매개변수와 입력받은 이름이 다르기 때문이다. )
assign1.sh 파일을 실행하기 전에 ls하여 현재 날짜로 된 실행파일이 없음을 확인할 수 있다.
apple을 매개변수로 하여 assign1.sh 파일을 실행시킨 후 who are you?라는 질문에 apple과 같은 apple을 입력해주면
ls -l한 결과가 잘 출력되고 컴파일 할 파일을 묻고 입력받을 수 있게 함을 확인할 수 있다.
hello.c를 입력하면 Success to compile이라는 메세지가 잘 뜨는 것을 확인할 수 있다.
위와 같이 ls를 입력하여 파일을 확인해보면 a.out 대신 현재 날짜(20200602)로 파일명이 잘 변경된 것을 확인할 수 있다.
또한, 20200602 파일을 실행시켜보면 hello.c파일에 입력되어있던 내용을 컴파일한 내용이 잘 출력됨을 확인할 수 있다.
1. 매개변수 총 4개를 가지고 실행한다. ( 매개변수명은 자유롭게 가능) 2. 첫번째 매개변수(ex. abcd)는 디렉토리명으로, 사용자 홈디렉토리에 생성한다. (~/) 3. 만든 디렉토리로 이동하여, 매개변수2,3,4 (ex. a, b, c)의 이름의 파일을 생성한다. (touch) 4. 만든 디렉토리에 파일이 잘 생성되었는지 확인하기 위해, ls –l을 해준다. 5. 삭제할 파일을 묻고(read), 입력 받아, 삭제한다. (rm) 6. 삭제 한 후, 다시 ls –l하여 삭제된 것을 확인할 수 있도록 한다.
vi 편집기로 assign0.sh 라는 파일에 위와 같은 내용을 입력해준다.
#! /bin/bash를 입력하여 실행할 쉘스크립트를 만들어 준다.
디렉토리를 생성하는 명령어인 mkdir을 이용하여 홈 디렉토리(~)에 $1 디렉토리를 생성해준다. ($1은 매개변수1을 의미)
만들어진 디렉토리로 이동하기 위해 cd ~/$1을 입력해준다.
만들어진 디렉토리에 매개변수 2, 3, 4 파일을 생성하기 위해 touch 명령어를 이용한다. ($2, $3, $4는 매개변수2,3,4를 의미)
만들어진 디렉토리에 파일이 잘 생성되었는지 확인하기 위해 ls -l을 해준다.
삭제할 파일을 묻기 위해 read 명령어를 이용한다. (-p는 입력과 출력을 한 행에서 처리해주는 옵션)
file이라는 변수로 삭제할 파일을 입력받은 후 rm 명령어를 이용하여 입력한 파일을 삭제한다.
입력한 파일이 잘 삭제되었는지 확인하기 이해 다시 ls -l을 해준다.
vi 편집기를 저장 후 종료하고, assign0.sh 파일을 실행시키면 다음과 같다.
assign0.sh 라는 파일에 실행 권한을 부여해준 후 abcd라는 디렉토리와 a, b, c라는 파일을 생성한다
위와 같이 처음에는 입력한 파일이 잘 생성된 것을 볼 수 있고 delete file에 삭제할 파일명을 입력하면
1. 루트 디렉토리, /home 디렉토리, 사용자 홈 디렉토리(~) 의 아이노드 번호와 링크 수 확인
※ 모든 디렉토리는 항상 두 개의 항목( 자기자신(.) , 부모 디렉토리(..) )을 가지고 있다.
※ 모든 디렉토리의 기본적인 링크수는 2이다.
※ ls -ali라는 명령어를 이용하여 다음 그림과 같이 모든 파일의 상세 정보와 아이노드 번호를 출력하고,
아이노드 번호와 링크 수를 확인한다.
- 루트 디렉토리
- /home 디렉토리
- 사용자 홈 디렉토리(~)
2. 사용자 홈 디렉토리(~)에 week3 디렉토리 생성
mkdir을 이용하여 week3 디렉토리를 생성한다.
stat을 이용하여 파일의 메타 정보를 출력한다.
※ stat[파일명] → 크기, 파일타입, 장치, 하드링크수, 접근권한, 소유자, 그룹, 접근시간, 수정시간 등을 알 수 있다.
3. week3 디렉토리에 test.txt 파일 생성
touch로 test.txt라는 파일을 생성한다
ls명령어를 이용하여 파일 목록을 확인할 수 있고 현재 test.txt 파일의 하드링크 수는 1개임을 확인할 수 있다.
4. week3 디렉토리에 test.txt 파일의 하드 링크 파일 hd.test 파일 생성
ln 원본파일명 하드링크파일명 → test.txt 파일의 하드 링크 파일 hd.test 파일을 생성한다.
hd.test와 test.txt의 아이노드 번호는 같고 하드링크 수는 1 증가하여 2개임을 확인할 수 있다.
※ 원본 파일과 하드링크 파일은 같은 아이노드 번호를 공유한다.
vi 편집기로 hd.test파일에 hello world를 입력한 후 cat을 이용하여 파일 내용을 출력해보면 test.txt와 hd.test 둘 다 동일한 내용이 출력되는 것을 볼 수 있다.
위와 같이 aa와 bb파일을 생성했을 때 하드링크 수가 증가하는 것을 확인할 수 있다.
vi 편집기로 hd.test의 내용을 hello swing으로 편집한 후 test.txt의 파일 내용을 출력하면 hello swing이 출력되는 것을 확인할 수 있다. 또한 test.txt 파일을 삭제한 후 hd.test의 파일 내용을 출력했을때, 출력이 가능함을 확인할 수 있다.
5. week3 디렉토리에 test.txt 파일의 심볼릭 링크 파일 ls.test 파일 생성
ln -s 원본파일명 심볼릭링크파일명 → test.txt 파일의 심볼릭 링크 파일 ls.test 파일을 생성한다.
심볼릭 링크 파일이 파란색 글씨로 생성된 것을 볼 수 있고 원본 파일과 심볼릭링크 파일의 아이노드 번호가 다르다는 것을 확인할 수 있다.
test.txt 파일을 삭제했을 때 아무런 문제가 나타나지 않던 하드링크와 다르게 심볼릭 링크는 ls.test 파일의 글씨가 빨간색으로 바뀐 것을 볼 수 있고 ls.test 파일의 내용을 출력하지 못하는 것을 확인할 수 있다.
파일 시스템의 논리적 구조 작성하기
1. 루트 디렉토리, /home 디렉토리, 사용자 홈 디렉토리(~) 의 아이노드 번호와 링크 수 확인
- 루트(/) 디렉토리
루트 디렉토리 이외에 아무것도 없다면 위와 같은 그림을 그릴 수 있다.
stat 명령어를 이용하여 루트 디렉토리의 아이노드 번호와 링크 수를 확인할 수 있다.
이를 이용하여 루트 디렉토리의 논리적 구조를 그리면 다음 그림과 같다.
- /home 디렉토리
stat 명령어를 이용하여 홈 디렉토리의 아이노드 번호와 링크 수를 확인할 수 있다.
이를 이용하여 홈 디렉토리의 논리적 구조를 그리면 다음 그림과 같다.
- 사용자 home 디렉토리 (~)
stat 명령어를 이용하여 사용자 홈 디렉토리의 아이노드 번호와 링크 수를 확인할 수 있다.
이를 이용하여 사용자 홈 디렉토리의 논리적 구조를 그리면 다음 그림과 같다.
2. 사용자 홈 디렉토리(~)에 week3 디렉토리 생성
stat 명령어를 이용하여 사용자 홈 디렉토리에 생성한 week3 디렉토리의 아이노드 번호와 링크 수를 확인할 수 있다.
위의 그림과 같이 사용자 홈 디렉토리 엔트리에 week3 디렉토리가 추가된다.
week3 디렉토리의 아이노드 블록과 데이터 블록이 생성되고 week3 디렉토리 아이노드의 포인터는 week3의 데이터 블록을 가리킨다.
3. week3 디렉토리에 test.txt 파일 생성
week3 디렉토리에 test.txt 파일을 생성하면 week3디렉토리 엔트리에 test.txt가 추가된다.
이 때, test.txt 파일의 내용은 Hello world이다.
4. week3 디렉토리에 test.txt 파일의 하드 링크 파일 hd.test 파일 생성
week3 디렉토리에 하드링크 파일 hd.test 파일을 생성하면 week3 디렉토리 엔트리에 hd.test 파일이 추가된다.
이 때, 하드링크 파일 hd.test와 원본 파일 test.txt의 아이노드 번호는 동일하다.
또한, 하드링크 파일이 추가되었기 때문에 원본 파일의 링크 수가 증가한다.
5. week3 디렉토리에 test.txt 파일의 심볼릭 링크 파일 ls.test 파일 생성
week3 디렉토리에 심볼릭링크 파일 ls.test 파일을 생성하면 week3 디렉토리 엔트리에 ls.test 파일이 추가된다.
이 때, 소프트 링크 파일의 아이노드가 생성되고 소프트 링크 파일의 데이터 블록에 원본 파일의 경로가 저장된다.