< 과제 2 >

 

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에 삭제할 파일명을 입력하면

입력한 파일이 잘 삭제된 것을 확인할 수 있다.

 

 

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 5 - 1  (0) 2020.06.07
Linux Study Week 4 - 3  (0) 2020.06.01
Linux Study Week 4 - 1  (0) 2020.06.01
Linux Study Week 3 - 3  (0) 2020.05.24
Linux Study Week 3 - 2  (0) 2020.05.24

< 쉘 스크립트 >

 

vi 편집기에 위와 같은 내용을 입력한다.

#!는 매직 넘버로 스크립트를 처리하는 인터프리터이다. 즉, 스크립트 파일을 bash 쉘로 실행시킨다는 의미이다.

echo는 화면에 문자열을 출력하기 위해 사용된다.

exit 10은 종료 상태를 나타낸다.

 

hello.sh 파일에 실행 권한을 부여해준 후 실행시키면 입력한 내용이 잘 출력되는 것을 볼 수 있다.

위와 같이 실행하는 방법은 ./와 bash를 쓰는 두 가지 방법이 있다.

 

ls명령어를 이용하여 hello.sh 파일이 생성된 것을 확인할 수 있다.

exit [종료상태]는 종료값을 지정하며 스크립트를 종료하고 $? 변수에 저장된다. ($?는 가장 최근 명령어의 종료 상태)

종료 상태의 범위는 0~255이고 0은 성공, 1~255는 오류코드를 나타낸다.

ls -l 후의 $?은 성공했으므로 0이고 ./hello.sh의 종료상태는 10으로 입력해두었기 때문에 10으로 나오는 것을 볼 수 있다.

 

< 변수사용과 매개변수 >

 

vi 편집기로 name.sh 이라는 파일에 내용을 입력한다.

위와 같이 변수를 선언할 수 있는데, 변수 선언 시 = 앞뒤로 공백이 없어야 한다.

변수의 값을 지정해주기 위해 name 앞에 $을 붙여야한다.

※ $( )는 실행결과를, $(( ))는 계산결과를 나타낸다.

 

저장하고 name.sh 파일을 출력하면 변수에 저장된 값으로 잘 출력되는 것을 볼 수 있다.

 

큰 따옴표(" ")는 변수의 값을 잘 출력해주지만, 작은 따옴표(' ')는 $의 의미를 없앤다.

 

또한, 문자열에서 큰 따옴표(" ")는 공백을 보존하여 출력해주지만 따옴표 없는 echo는 보존해주지 않는다.

 

그리고, 역 따옴표(` `)는 실행 결과를 나타낸다.

 

vi 편집기로 prac1이라는 파일에 위와 같은 내용을 입력한다.

prac1 파일에 실행 권한을 부여한 후 실행시키면 다음과 같다.

 

그냥 echo는 공백을 보존해주지 않기 때문에 a bcd로 출력이 된다.

큰 따옴표(" ")는 공백을 보존해주기 때문에 입력한 내용이 그대로 출력되는 것을 확인할 수 있다.

작은 따옴표(' ')는 $의미를 없애주기 때문에 $b로 출력되는 것을 볼 수 있다.

 

vi 편집기로 param1.sh 라는 파일에 위와 같은 내용을 입력해준다.

$* : 입력된 매개변수들의 목록

$# : 입력된 매개변수들의 수

$0 : 쉘 스크립트 이름

$1, $2, ··· : 매개변수 1, 2, ···

\ : $의 의미를 잃음

※ 따옴표(" ")로 묶는 것은 하나의 매개변수로 취급한다.

 

먼저 param1.sh 파일에 실행 권한을 부여해준다.

매개변수로 a b c 를 입력했으므로 $*에는 a b c가 출력되고, 매개변수의 수는 3개이므로 $#에는 3이 출력된다.

쉘 스크립트 이름은 param1.sh이므로 $0에 잘 출력되었고 $1, $2에는 매개변수 1(=a), 매개변수 2(=b)가 출력된 것을 확인할 수 있다.

 

위와 같이 date 명령어를 통해 날짜와 시간을 알 수 있다.

date +포맷을 입력하여 세부 정보를 알 수 있는데, 이 때 +와 포맷 사이에 공백은 없어야 한다.

 

※ 명령어 조건 실행에는 논리곱(&&)과 논리합(||)이 있다.

명령어1 && 명령어2는 논리곱으로 명령어1의 실행 결과가 성공이면 명령어2를 실행한다.

명령어1 || 명령어2는 논리합으로 명령어1의 실행 결과가 실패면 명령어2를 실행한다.

 

< 입력 >

 

vi 편집기로 read1.sh 파일에 위와 같은 내용을 입력한다.

read는 표준 입력을 문자열을 받는 쉘 내장 명령어로 형식은 read [옵션] [변수명]이다.

 

read1.sh 파일에 실행 권한을 부여한 후 실행시키면 read명령어로 인해 원하는 내용을 입력할 수 있고,

다음 행에서 입력한 내용이 잘 출력되는 것을 볼 수 있다.

※ 입력과 출력을 한 행에서 처리하고 싶다면 -p라는 옵션을 주면 된다.

 

vi 편집기로 read2.sh 라는 파일에 위와 같은 내용을 입력한다.

입력과 출력을 한 행에서 처리하기 위해 -p 옵션을 사용했다.

또한, if문으로 문자열을 비교하여 입력한 문자열이 같다면 same, 다르다면 not same, 끝났다면 end가 출력되도록 했다.

※ if문을 쓸 때 괄호([ ])와 비교 연산자(= 또는 ==) 앞뒤에 반드시 공백이 있어야 한다.

 

위와 같이 name1과 name2는 한 행에서 입력과 출력을 받을 수 있고,

입력한 문자가 같다면 same, 다르다면 not same, 조건문이 끝났으면 end가 출력되는 것을 확인할 수 있다.

 

vi 편집기로 terminator1 파일에 위와 같은 내용을 입력한다.

명령 << [입력 종료문자]를 입력하면 입력 종료문자가 입력될 때까지 키보드 입력을 받는다.

이것은 표준 입력을 사용자로부터 받아들이지 않고 자동으로 처리할 때 사용한다.

 

위와 같이 실행 권한을 부여한 후 실행시키면 vi 편집기에서 입력했던 내용이 잘 출력되는 것을 볼 수 있다.

 

< 실습 1 >

1. 홈디렉토리(~) 에 password라는 디렉토리 만들기
2. password 디렉토리로 이동하기
3. 현재 디렉토리로, /etc/passwd 파일을 복사해온다.

 

#! /bin/bash를 입력하여 실행할 쉘스크립트를 만들어 준다.

mkdir을 이용하여 홈 디렉토리(~)에 password라는 디렉토리를 만든다.

password 디렉토리로 이동하기 위해 cd라는 명령어를 사용하여 이동한 후

현재 디렉토리(.)로 /etc/passwd 파일을 복사해오기 위해 명령어 cp를 사용한다.

 

위와 같이 ls를 통해 password라는 디렉토리가 홈 디렉토리에 생성된 것을 볼 수 있고,

password 디렉토리로 이동한 후 ls로 파일 목록을 확인하면 passwd라는 파일이 잘 복사된 것을 확인할 수 있다.

 

< 실습 2 >

c 파일을 매개변수로 받아 컴파일 하여 실행해주는 스크립트 작성하기

 

vi 편집기로 param2.sh라는 파일에 인터프리터를 알려준 후

c 파일을 매개변수로 받아 컴파일 하기 위해 gcc $1을 입력해준다. ($1은 매개변수1을 의미한다.)

또한 a.out을 실행시키기 위해 echo $( )를 입력해준다.

 

vi 편집기로 hello.c라는 파일에 위와 같은 내용을 입력해준다.

 

param2.sh라는 파일에 실행 권한을 부여해준 후 hello.c라는 매개변수를 실행시킬 수 있도록 입력해주면

Hello Linux라는 hello.c의 파일 내용이 잘 출력되는 것을 확인할 수 있다.

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 4 - 3  (0) 2020.06.01
Linux Study Week 4 - 2  (0) 2020.06.01
Linux Study Week 3 - 3  (0) 2020.05.24
Linux Study Week 3 - 2  (0) 2020.05.24
Linux Study Week 3 - 1  (0) 2020.05.24

 < 포인터 > 

▶ 포인터란?

- 변수의 메모리 공간주소를 가리키는 변수

- 포인트 변수의 크기는 무조건 4byte이다.

- 포인터 선언 :  '*' 를 붙여준다.

                        → 선언 방식 : 자료형 * 포인터 변수 이름;

- 포인터 초기화 : 변수 이름 앞에 '&'를 붙여준다.

                           ※ 배열의 이름은 그 자체가 주소이므로 '&'를 붙이지 않는다.

 

< 변수인 경우 > < 배열인 경우 >
int a;
int* p;
p = &a
int a [10];
int* p;
p = a;

- 포인터 변수에는 변수의 주소가 들어간다.

- 포인터를 이용하면 메모리에 직접접근이 가능하고 함수를 넘나들어 사용할 수 있게 된다.

- 포인터 활용

char ch; // 문자형 변수 선언, 1byte 차지

char* p; // 포인터 변수 선언, 4byte 차지

ch = 'A'; // 문자형 변수에 문자 'A' 대입

p = &ch; // 포인터 변수에 변수 ch의 주소인 '&ch' 대입

- 포인터가 유용한 경우

  • 배열은 포인터를 사용하여 구현된다. 포인터는 배열을 반복할 때 사용할 수 있다. (배열 인덱스 대신 사용 가능)
  • C++에서 동적으로 메모리를 할당할 수 있는 유일한 방법이다. (가장 흔한 사용 사례)
  • 데이터를 복사하지 않고도 많은 양의 데이터를 함수에 전달할 수 있다.
  • 함수를 매개 변수로 다른 함수에 전달하는 데 사용할 수 있다.
  • 상속을 다룰 때 다형성을 달성하기 위해 사용한다.
  • 하나의 구조체/클래스 포인터를 다른 구조체/클래스에 두어 체인을 형성하는 데 사용할 수 있다. 

 

▶ 간접 참조 연산자

- 지정된 주소에 있는 값을 액세스하는 연산자

- 역 참조 연산자, 간접 연산자, * 연산자라고도 한다.

- 피연산자의 메모리에 접근하여 주소 값을 저장해가는 변수

- ex) a의 주소를 100번지를 가리킨다고 가정하자.

 

int a = 200;
int* p;
p = &a;

cout << p; // 이 경우 a의 주소값인 100이 출력됨
cout << *p; // 이 경우 a의 값인 200이 출력됨

위의 표처럼 포인터 변수 앞에 '*' 을 붙여주어야 값이 출력된다.

 

▶ 포인터 연산

- 포인터 연산 규칙

① 포인터끼리 더할 수 없다. ( 주소 값을 더하는 것은 쓸모가 없음 )

② 포인터끼리 뺄 수 있다. ( 주소 값의 거리를 구함으로써 메모리상에서 얼마나 떨어져 있는지 구해낼 수 있음 )

③ 포인터에 정수를 더하거나 뺄 수 있다.

④ 자료형 포인터의 값을 1 증가시키면 자료형의 크기만큼 증가된다.

⑤ 포인터끼리 대입은 가능하다. ( 단, 대입받을 포인터와 대입할 포인터의 타입이 일치해야함 )

⑥ 포인터에 정수를 대입할 수 없다.

⑦ 포인터와 실수와의 연산은 할 수 없다.

⑧ 포인터끼리 비교는 가능하다.

 

- 포인터 증감 연산

     ※ 증감 연산자(++, --)와 참조 연산자(*)는 함께 쓰일 수 있다.

 

 a = *ptr++ a에 ptr의 값을 대입한 후 ptr 증가 (주소가 증가)
 a = (*ptr)++ a에 ptr의 값을 대입한 후 *ptr 증가 (값이 증가)
 a = *++ptr ptr 증가한 후 a에 대입 (주소가 증가, 증가한 주소가 가리키는 값 대입)
 a = ++*ptr *ptr 증가한 후 a에 대입 (값의 증가, 증가한 값 대입)

- ex) a의 주소는 100번지, b의 주소는 200번지라고 가정하자.

 

int b = 10;
int* ptr = &b;
int a;

cout << ptr; // b의 주소값인 200이 출력됨
cout << *ptr; // b의 값인 10이 출력됨

a = *ptr++;

cout << a; // 값을 대입 후 ptr이 증가하므로 10이 출력됨
cout << ptr; // b의 주소에서 4바이트 증가한 204가 출력됨
cout << *ptr; // a의 주소값인 100이 출력됨
int b = 10;
int* ptr = &b;
int a;

cout << ptr; // b의 주소값인 200이 출력됨
cout << *ptr; // b의 값인 10이 출력됨

a = (*ptr)++;

cout << a; // 값을 대입 후 ptr이 증가하므로 10이 출력됨
cout << ptr; // ptr은 증가하지 않으므로 200이 출력됨
cout << *ptr; // ptr의 값이 증가하므로 11이 출력됨
int b = 10;
int* ptr = &b;
int a;

cout << ptr; // b의 주소값인 200이 출력됨
cout << *ptr; // b의 값인 10이 출력됨

a = *++ptr;

cout << a; // ptr을 증가시킨 후 대입하므로 a의 주소값인 
                  100이 출력됨
cout << ptr; // b의 주소에서 4바이트 증가한 204가 출력됨
cout << *ptr; // a의 주소값인 100이 출력됨
int b = 10;
int* ptr = &b;
int a;

cout << ptr; // b의 주소값인 200이 출력됨
cout << *ptr; // b의 값인 10이 출력됨

a = ++*ptr;

cout << a; // ptr의 값을 증가시킨 후 대입하므로 a의 값인
                 11이 출력됨
cout << ptr; // ptr은 증가하지 않으므로 200이 출력됨
cout << *ptr; // ptr의 값이 증가하므로 11이 출력됨

 

▶ 포인터와 배열

- 포인터와 배열은 매우 긴밀한 관게를 갖고 있고, 어떤 부분에서는 서로를 대체할 수도 있다.

- 배열의 이름은 포인터 상수이다.

※ 포인터 상수란 포인터 변수가 가리키고 있는 주소 값을 변경할 수 없는 포인터를 의미

- 가변 문자열 길이를 저장할 때는 배열보다 포인터가 유용하다.

- 정수형 배열의 메모리 할당

ex) int aa[3] = {10, 20, 30};

- 배열의 주소 표현
• aa[0]의 주소(&aa[0]) = 1031번지
• aa[1]의 주소(&aa[1]) = 1035번지
• aa[2]의 주소(&aa[2]) = 1039번지
• 배열 이름 aa = 전체 배열의 주소 = 1031번지
• 배열 aa의 주소를 구할 때는 ‘&’를 쓰지 않고, 단순히 ‘aa’로 표현

- 배열 이름 활용법

ex) aa 값을 1031로 가정하고, aa+1을 계산한 결과는?
    • 예상결과 : aa+1 ➔ 1031 + 1 = 1032 (X)
    • 실제 결과: aa+1 ➔ 1031 + 4 = 1035 (O)

계산 과정)
 ‘+1’의 의미 : 배열 aa의 위치에서 한칸 건너뛰어라
 한칸 : aa가 정수형 배열이므로 4byte
 즉, aa+1 = &aa[1] = 1035

 

배열 첨자로 표현 배열 이름으로 표현 주소
&aa[0] aa + 0 1031
&aa[1] aa + 1 1035
&aa[2] aa + 2 1039

 

 

 

 

'2020-1 STUDY > C++ Study' 카테고리의 다른 글

C++ Study Week 1  (0) 2020.04.12

 < vi 편집기 > 

▶ vi의 세 가지 모드

모드 역할 및 특징
명령모드 - vi를 실행시키면 가장 먼저 접하는 기본이 되는 모드
- 커서의 이동, 수정, 삭제, 복사, 붙이기, 탐색 등을 한다.
- 입력모드 전환키인 i , a, o, I, A, O 등을 입력하면 입력모드로 전환되고
명령모드로 다시 전환하려면 [Esc]키를 누르면 된다.
입력모드
(Esc모드)
- 글자를 입력하는 문서를 만드는 모드
- 편집모드, input mode, insert mode 등으로 불린다.
- 명령모드에서 입력 전환키를 눌러서 전환하면 화면 아래에 '-- INSERT --'라고 표시된다.
콜론모드
(ex모드)
- 명령모드에서 ':'키를 입력했을 때 화면 맨 아랫줄에서 명령을 수행하는 모드
- 저장, 종료, 탐색, 치환, vi 환경설정 등의 역할을 한다.

 

▶ 입력모드

- 글자를 입력하기 위해서는 입력모드로 가야하는데, 'i'를 입력하면, 하단에 --INSERT--가 나오면서

글자를 입력할 수 있는 입력모드로 바뀐다.

※ 한/영 변환은 Shift + Spacebar를 입력하면 된다.

 

i 현재 커서의 위치부터 입력 I 현재 커서 줄의 맨 앞에서부터 입력
a 현재 커서의 위치 다음 칸부터 입력 A 현재 커서 줄의 맨 마지막부터 입력
o 현재 커서의 다음 줄에 입력 O 현재 커서의 이전 줄에 입력
s 현재 커서 위치의 한 글자를 지우고 입력 S 현재 커서의 한 줄을 지우고 입력

 

▶ 명령모드

- 입력모드에서 명령모드로 다시 전환하려면 Esc키를 누려면 된다.

- Esc키를 누르고 문자를 입력하려고 하면 비프음만 나고 입력은 되지 않는다.

- 명령모드는 편집모드라고도 하는데, 글을 입력시키는 방법이 아닌 수정과 편집을 할 수 있는 상태를 의미한다.

- 명령모드에서는 커서의 이동, 수정, 삭제, 복사, 붙이기, 탐색 등의 작업이 이루어진다.

- 잘못된 명령을 내렸을 때 'u'라는 명령어를 통해서 Undo, 즉 복구가 가능하게 할 수 있다.

 

G 파일의 맨 끝으로 ^ 현재 줄의 맨 앞으로 (빈칸무시)
0 현재 줄의 맨 앞으로 $ 현재 줄의 맨 뒤로
% 짝을 이루는 기호 확인 w 다음 단어로
b 이전 단어로 e 현재 단어의 끝 글자

 

▶ 콜론모드

- 명령모드에서 콜론모드로 전환하려면 Esc를 누른 후 ':' 명령을 실행시키면 된다.

- 콜론모드는 vi에서 사용할 수 있는 명령어들을 이용하는 곳이다.

- 윈도우 환경에서의 메뉴바와 같은 역할을 한다고 볼 수 있다.

- 파일 저장, 종료, 탐색, 치환, vi 환경설정 등의 역할을 한다.

 

:wq 편집한 데이터를 저장하고 종료
:q! 저장하지 않고 강제로 종료
:w vi를 끝내지 않고 현재 작업 중인 내용을 저장

 

▶ 정규표현식의 특수 기호들

. 한글자를 대표하는 기호 * 여러개의 문자를 동시에 대표하는 기호
^ 줄의 처음시작 $ 줄의 맨끝
% 처음줄부터 끝줄까지 \ 특수한 기호들이 가지는 뜻을 없앨 때 사용
\< 단어의 시작과 대응 \> 단어의 끝과 대응
[^] 묶여진 문자를 제외한 아무것이나 대응 \ 이어지는 기호를 문자 그대로 해석
[] 일정한 제한을 두어 글자를 대표하고자 하는 기호 [AB] A 또는 B

 

▶ 커서 움직이기

- 커서 이동은 키보드의 4개 화살표를 이용해서 이동해도 되지만, 기본적인 것은 빠르게 쓰기 위해 알아두도록 한다.

 

h 커서를 왼쪽으로 한 칸 이동 j 커서를 아래로 한 칸 이동
k 커서를 위로 한 칸 이동 l 커서를 오른쪽으로 한 칸 이동
w 다음 단어의 처음으로 이동 ^ 줄의 첫 문자로 이동
$ 현재 줄의 맨 끝으로 이동
(:$은 줄의 제일 끝으로 이동)
0 현재 줄의 처음으로 이동
(:0은 줄의 제일 처음으로 이동)
G 제일 끝 행으로 이동 gg 제일 첫 행으로 이동
nG n번째 행으로 이동 :숫자 + enter 해당 숫자의 행으로 이동
H 화면의 첫 줄로 이동 M 화면의 중간으로 이동
L 화면의 끝 줄로 이동 [ctrl] + b 이전 화면으로 이동
[ctrl] + d 반 정도 화면 이동 [ctrl] + f 다음 화면으로 이동
[ctrl] + e 커서는 현재 위치 그대로,
화면만 한줄씩 위로 이동
n% 입력한 n%에 해당하는 줄로 이동

 

▶ 편집하기

x 현재 커서가 위차한 문자를 삭제 dw 단어 삭제
dd 현재 커서의 행 삭제 숫자 dd 현재 커서부터 숫자만큼의 행을 삭제
yy 현재 커서가 있는 행을 복사 숫자 yy 현재 커서부터 숫자만큼의 행을 복사
p 복사한 내용을 현재 행 이후에 붙여넣기 P 복사한 내용을 현재 행 이전에 붙여넣기
u 직전에 내린 명령을 취소 U 현재 줄을 저장
 /exp + enter 'exp'와 같은 문자열을 현재 커서가 위치한 곳부터 아래 방향으로 검색 ?exp + enter 'exp'와 같은 문자열을 뒤에서부터
위 방향으로 검색
n 찾은 문자 중에서 다음 문자로 이동 N 찾은 문자를 이전 문자로(아래에서 위로) 이동

 

 

이외에도 vi편집기에서 사용되는 명령어들은 아주 많은데 기본적으로 리눅스 활용도를 높이기 위해 알아두면 좋을 것 같다.

필요한 명령어들은 그때그때 찾아서 활용하도록 한다.

출처 : kms0209.tistory.com/76

 

▶ 실습

 

- 입력모드

 

i를 누르면 하단에 -- INSERT -- 가 나오고 현재 커서의 위치부터 입력된다.

 

o를 누르면 현재 커서의 다음 줄부터 입력된다.

 

커서를 위 그림처럼 두었을 때

 

S를 누르면 현재 커서 위치의 한 줄을 지우고 입력된다.

 

 

- 명령모드

 

int main() 끝에 커서를 두고 0을 입력하면 현재 줄의 맨 앞으로 이동한다.

 

int main() 끝에 커서를 두고 w를 입력하면 다음 단어로 이동한다.

 

 

- 콜론모드

 

:wq를 입력하면 편집한 데이터를 저장하고 vi 편집기가 종료된다.

 

test.c 파일의 내용을 출력해보면 vi 편집기에서 입력했던 내용이 잘 들어가 있음을 확인할 수 있다.

 

:q!를 입력하면 편집한 데이터를 저장하지 않고 강제로 종료된다.

 

test.c 파일의 내용을 확인해보면 위에서 편집한 데이터가 저장되지 않은 것을 볼 수 있다.

 

 

- 커서 움직이기

 

위의 그림과 같이 커서의 위치를 고정하고 실습하도록 하자.

 

j를 누르면 커서가 아래로 한 칸 이동한다.

 

^를 누르면 커서가 그 줄의 첫 문자로 이동한다.

 

:숫자를 입력하고 enter키를 누르면 커서가 입력한 숫자의 행으로 이동한다.

 

ctrl키를 누른 후 e를 누르면 커서는 현재 위치 그대로 두고, 화면만 한줄씩 위로 이동한다.

커서가 i에 위치하고 있었기 때문에 화면이 한 줄 올라가면서 커서는 {에 위치하게 된다.

 

 

- 편집하기

 

화면 하단에 ?문자나 문자열을 입력하고 enter키를 누르면 입력한 문자나 문자열을 아래에서 위로 검색해준다.

 

커서를 int main()의 끝에 두고 dd를 입력하면 현재 커서의 행을 삭제한다.

 

커서를 main의 n에 두고 x를 입력하면 현재 커서가 위치한 문자(=n)를 삭제한다.

 

 

 

 

 

 

 

 

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 4 - 2  (0) 2020.06.01
Linux Study Week 4 - 1  (0) 2020.06.01
Linux Study Week 3 - 2  (0) 2020.05.24
Linux Study Week 3 - 1  (0) 2020.05.24
Linux Study Week 2 - 4  (0) 2020.05.18

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 파일이 추가된다.

이 때, 소프트 링크 파일의 아이노드가 생성되고 소프트 링크 파일의 데이터 블록에 원본 파일의 경로가 저장된다.

또한, 원본 파일의 링크 수는 바뀌지 않는다.

 

 

 

 

 

 

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 4 - 1  (0) 2020.06.01
Linux Study Week 3 - 3  (0) 2020.05.24
Linux Study Week 3 - 1  (0) 2020.05.24
Linux Study Week 2 - 4  (0) 2020.05.18
Linux Study Week 2 - 3  (0) 2020.05.18

[ 요약 ]

 

위 그림과 같이 하드 링크는 원본 파일과 동일한 inode를 직접적으로 가리키기 때문에 원본 파일이 사라지더라도

데이터만 살아 있다면 원본 파일에 접근이 가능하다.

반면, 심볼릭 링크는 또 다른 inode를 생성하여 생성된 iode는 포인터를 가리키고 포인터는 원본 파일을 가리킨다.

따라서 심볼릭 링크를 통해 데이터에 접근할 경우 원본 파일을 거치기 때문에 원본 파일이 사라질 경우

해당 데이터에 접근할 수 없다.

 

 

 < 하드링크 > 

 

- ln [원본파일명] [하드링크파일명]

 

- 파일이 물리적으로 저장된 주소를 가리키는 링크

 

- 원본파일의 inode를 참조하는 파일이다.

 

- 하드링크 파일은 파일의 정보를 담고 있는 원본 파일의 inode를 공유하기 때문에 사실상 파일명만 다를뿐

같은 파일을 가리킨다고 할 수 있다.

 

- 하드링크파일의 내용을 수정하게 되면 원본파일의 내용도 수정되고, 원본파일을 수정해도

하드링크 파일의 내용이 수정된 것을 볼 수 있다.

 

- 원본 또는 하드링크에서 권한 변경 시 둘 다 동일한 권한으로 변경된다.

 

- 하드링크의 파일을 지우고자 한다면 원본과 링크 파일 두 개를 모두 지워야 한다.

 

- 자원을 공유하면서도 데이터를 안전하게 관리하고자 할 때 주로 사용된다.

 

 

 < 심볼릭 링크 > 

 

- ln -s [원본파일명] [심볼릭링크파일명]

 

- 파일 또는 디렉토리를 가리키고 있는 포인터

 

- 소프트링크라고도 하며, 원본파일과 별개의 inode를 갖는다.

 

- 심볼릭링크가 가리키는 실제 파일은 일반 파일과는 다르게 포인터 역할을 하며, 해당 포인터는 실제 원본 파일을 가리킨다.

 

- 윈도우의 바로가기파일과 비슷하다.

 

- 원본 파일이 삭제되면 링크 파일의 포인터가 가리키는 내용이 사라지게 되기 때문에

각 파일의 inode를 조회해보면 서로 다른 내용임을 알 수 있다.

 

- 만약 원본 파일을 다른 장소로 이동시키면 심볼릭 링크가 깨지기 때문에 삭제와 비슷한 결과를 받을 수 있다.

 

- 링크파일의 권한 변경 시 링크파일의 권한이 변경되는 것이 아니라 원본파일의 권한이 변경된다.

 

- 파일의 불필요한 반복적 복사를 방지하여 파일 시스템을 유연하게 활용하거나

비슷한 역할을 담당하는 여러 파일 중 하나를 선택하여 대표적으로 사용하려 할 때 유용하게 쓸 수 있다.

 

 

 < 하드링크와 심볼릭링크 비교> 

 

  하드링크 심볼릭링크
ln 옵션 옵션 X -s
하드링크 개수 링크마다 1 증가 링크 개수 증가 X
원본 파일 용량 용량 X 용량 0 (파일명이 용량)
다른 파일 시스템 링크 불가 링크 가능
원본 파일 내용 접근 가능 접근 가능
파일 내용 수정 원본파일 내용이 수정 원본파일 내용이 수정
원본 파일 삭제 접근 가능 접근 불가
디렉토리 링크 불가 링크 가능
퍼미션 의미 O 의미 X
링크 생성 권한이 있어야 함 권한 없어도 가능

 

 

 

 

 

 

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 3 - 3  (0) 2020.05.24
Linux Study Week 3 - 2  (0) 2020.05.24
Linux Study Week 2 - 4  (0) 2020.05.18
Linux Study Week 2 - 3  (0) 2020.05.18
Linux Study Week 2 - 2  (0) 2020.05.18

 < 파일 시스템 > 

 

: 파일이나 자료를 쉽게 발견하고 접근할 수 있도록 보관 또는 조직하는 체제

  → 리눅스에서는 주로 파티션을 나누고 정리하는데 사용된다.

 

: 파일 + 디렉토리 구조

 

 

: 파일 구조

 

①  부트 블록 ( boot block ) 

 

     - 운영체제를 주기억장치에 올리는 역할을 하는 프로그램이 들어 있는 영역

          → 윈도우의 부트 레코드와 유사

     - 운영체제를 부팅시키기 위해 필요한 코드를 저장한다.

     - 대부분의 파일 시스템들은 부트블록으로 시작한다.

     - 하드웨어가 부팅에 필요한 코드를 부트블록에서 찾는다.

 

 슈퍼 블록 ( super block ) 

    

     - 디스크에 대한 다양한 정보(파일 시스템의 전체적인 정보)를 저장하고 있는 곳

     - 블록 그룹의 가장 앞에 위치한다.

     - 리눅스 운영체제는 슈퍼블록의 정보를 사용하여 파일 시스템을 관리한다.

     - 슈퍼블록이 소유한 정보

         → 파일 시스템 크기, 블록 수, 이용 가능한 빈 블록 목록
         → 빈 블록 목록에서 그 다음 빈 블록을 가리키는 인덱스
         → inode 목록 크기, 파일 시스템에서 빈 inode 수와 목록
         → 빈 inode 목록에서 그 다음 빈 inode 수와 목록
         → 빈 블록과 빈 inode 목록들에 대한 록 필드
         → 슈퍼 블록들이 수정되었는지에 대한 플래그
         → 파일 시스템 이름 및 디스크 이름

 

③  아이노드 블록 ( inode) 

 

     - inode들을 모아놓은 곳; 한 블록에 여러 개의 inode를 저장하고 있다.

     - 파일이나 디렉토리에 대한 모든 정보를 가지고 있는 구조체

     - 파일 하나당 하나의 아이노드가 사용되며 여러 파일의 참조(link)가 가능하다.

     - 파일을 처리할 때 파일 이름이 아닌 아이노드 번호를 이용한다.

     - 아이노드가 소유한 정보

         → 파일크기
         → 생성시간, 사용시간, 변경시간
         → 접근권한
         → 사용자 ID, 그룹 ID
         → 파일 링크 수
         → 데이터 블록 주소

      - 아이노드의 기능

          1. 파일을 생성하면 inode가 "아이노드 리스트"에 만들어지고 inode-Number 및 파일 이름, 디렉토리가 등록됨.
          2. 파일을 삭제하면 inode 파일 링크 수가 하나 감소되고 해당 파일의 inode-Number는 0으로 바뀜.
          3. 원본 파일을 하드 링크하면 동일한 inode-Number임.

      - 아이노드 블록 관리 방법

           → 단일/이중/삼중 간접 블록 포인터

           → 아이노드 블록을 몇번 거쳐가냐의 차이 (링크로 연결하여 관리)

 

실제 데이터 블록을 가리키는 포인터

 

 

  데이터 블록 ( data block ) 

 

     - 일반적인 파일과 디렉토리, 간접 블록을 저장하는 디스크 영역

     - 실제 데이터가 파일의 형태로 저장되는 공간

     - 간접 블록 : 추가적인 데이터 블록을 위한 포인터들이 사용할 동적으로 할당되는 공간

     - 홀 : 아이노드나 간접 블록 안의 데이터 블록의 주소로 특별한 값을 저장

     - 파일 이름과 아이노드 번호를 저장하기 위해서 사용된다.

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 3 - 2  (0) 2020.05.24
Linux Study Week 3 - 1  (0) 2020.05.24
Linux Study Week 2 - 3  (0) 2020.05.18
Linux Study Week 2 - 2  (0) 2020.05.18
Linux Study Week 2 - 1  (0) 2020.05.18

swing 계정으로 c 언어 코드 작성하여, 컴파일 한다. 

swing 계정으로 touch를 이용하여 test.c라는 파일을 만든다.

vi로 C언어 코드를 작성한 후 cat명령어를 이용하여 test.c파일에 vi로 작성한 내용을 확인할 수 있다.

 

gcc를 이용하여 컴파일한 후 a.out을 실행시키면 hello world를 출력하는 것을 볼 수 있다.

 

1-1. apple 계정으로 a.out 파일 실행

apple 계정으로 a.out을 실행시키면 hello world를 출력하는 것을 볼 수 있다.

위에서 a.out의 기타 사용자는 실행 권한이 있었기 때문에 apple 계정에서 실행시키는 것이 가능한 것이다.

 

1-2. swing 계정으로 다른 사람이 실행할 수 없게 바꾸기

swing 계정으로 들어가 chmod를 이용하여 권한을 수정한다.

8진수 754는 2진수로 111 101 100이고 이는 기타 사용자가 읽기 권한만 있다는 의미이다.

 

1-3. apple 계정으로 a.out 실행해 보기

swing계정에서 기타 사용자의 실행 권한을 삭제했기 때문에 apple 계정에서 a.out은 실행되지 않는다.

 

2-1. swing 계정으로 소스코드에 실행권한 부여

소스코드는 test.c 파일에 있고 chmod를 이용하여 이 파일의 권한을 수정한다.

8진수 755는 2진수로 111 101 101이고 이로 인해 모든 사용자에게 실행권한이 부여된다.

 

2-2. swing 계정으로 해당파일 실행 해보기

swing 계정으로 a.out을 실행해보면 실행이 가능하다.

위에서 모든 사용자가 실행할 수 있도록 권한을 수정해주었기 때문에 실행이 가능한 것이다.

 

2-3. swing 계정으로 소스코드를 누구나 쓸 수 있게 바꾼다.

8진수 777은 2진수로 111 111 111이다.

이는 모든 사용자가 모든 권한을 가질 수 있음을 의미하고 이로 인해 소스코드를 누구나 쓰는 것이 가능하다.

 

3. apple 계정으로 소스코드 파일을 apple의 홈 디렉토리 (/home/apple)로 옮긴다.
(안 되면 권한을 변경하여, 옮긴다. )

apple 계정으로 test.c 소스코드 파일을 apple의 홈 디렉토리로 옮기기 위해 mv 명령어를 사용한다.

하지만 허가 거부라는 오류가 난다.

 

안 되는 이유는 파일을 이동하려면 해당 파일의 디렉토리에 쓰기 권한이 있어야 하는데 swing의 홈 디렉토리에는 다른 사용자에 대한 w권한이 없기 때문이다.

 

chmod 777로 swing의 홈 디렉토리의 권한을 변경한다.

따라서 모든 사용자가 모든 권한을 가질 수 있고 이로 인해 소스코드 파일을 다른 사용자도 옮길 수 있게 된다.

 

권한 변경 후 apple 계정으로 가서 파일을 옮겼더니 잘 옮겨진 것을 볼 수 있다.

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 3 - 1  (0) 2020.05.24
Linux Study Week 2 - 4  (0) 2020.05.18
Linux Study Week 2 - 2  (0) 2020.05.18
Linux Study Week 2 - 1  (0) 2020.05.18
Linux Study Week 1 - 4  (0) 2020.04.13

+ Recent posts