타겟 저장소에서 Fork 버튼 클릭

위 과정을 통해 상대방 레포지토리와 내 레포지토리의 버전이 같은 상태가 된다.

위와 같이 현재 내 계정에 fork된 것을 확인할 수 있고, 해당 주소를 이용하여 clone을 진행한다.

파일 수정 후 add, commit, push를 진행한다.

이제 개선된 내 코드의 버전이 앞서므로 내 코드를 pull로 받아가라고 요청해야 한다.

이는 Pull requests로 요청할 수 있다. 

위와 같이 New pull request와 Create pull request를 진행해주면 풀 리퀘스트가 요청된다.

이 후 원작자의 알림창에 풀리퀘스트 요청이 들어오고, 마음에 든다면 Merge pull request 버튼을 클릭하여 받거나 거절할 수 있다.

 

※ 이 방식은 실수로 커밋될 일이 없다는 장점이 있지만, 풀 리퀘스트가 올 때마다 원작자가 매번 확인해야 한다는 단점이 있다.

'네트워크캠퍼스 > GIT, GITHUB' 카테고리의 다른 글

git-flow  (0) 2024.02.20
Github CLI  (0) 2024.01.31
.gitignore 파일의 필요성  (0) 2024.01.12
  (0) 2024.01.12
클론  (0) 2024.01.11

1. 환경설정

$ docker run -d --name=shellprac ubuntu:22.04
$ docker exec -it shellprac bash

위 명령어를 통해 도커 컨테이너 환경에서 실습을 진행했다.

# apt-get update
# apt-get install file

먼저, 쉘스크립트 내에 작성된 명령어를 확인하기 위해서 file을 설치해준 후 진행한다.

위 명령어로 /usr/bin/* 경로인 모든 파일 중 shell script를 검색하면 위와 같이 쉘스크립트로 작성된 명령어들을 확인할 수 있다.

루트계정으로 명령을 내리지 않기 위해 jihyun 계정을 추가하여 실습을 진행했다.

위와 같이 sandbox 폴더를 생성한 후 실습을 진행했다.

 

※ 쉘 스크립트를 사용하면 좋은 경우

① 중규모 시스템에서 자동화하기

② 성능보다 자동화 자체에 방점을 두기

 

 

2. 일기장 작성 실습

root # apt-get install nano -y
jihyun $ nano diary.sh

루트 계정에서 nano 에디터를 설치한 후 다시 돌아와 diary.sh에 아래와 같은 스크립트를 작성했다.

먼저, ${HOME}/diary라는 경로를 directory 변수에 저장한다. (※ 할당 연산자 사용 시 띄어쓰기 금지)

directory 변수에 적힌 경로에 폴더가 존재하지 않는다면 mkdir 명령으로 폴더를 생성해준다.

nano 에디터를 이용하여 연-월-일.txt 형식으로 당일 서버시간 기준 날짜로 일기 파일을 생성해준다.

위와 같이 실행 권한을 부여한 후 조회해보면 diary.sh가 잘 생성된 것을 확인할 수 있다.

diary.sh를 실행해주면 자동으로 home 폴더 하위에 diary 폴더를 만들고, 만약 없다면 연-월-일.txt라는 파일을 nano 에디터로 실행해준다.

또한, 파일에 위와 같은 문구를 작성해주고 다시 diary.sh를 실행해보면 이미 diary 폴더가 존재하므로 새로 만들지는 않고, 아까 작성 완료한 내용이 기입된 채로 파일이 열리는 것을 확인할 수 있다.

 

일기장 쉘스크립트를 개선하기 위해 diary.sh 코드를 아래와 같이 수정했다.

먼저, directory 폴더 하위에 diaryfile이라는 명칭으로 연-월-일.txt를 저장하는 변수명을 하나 더 만들어주었따.

diaryfile이 존재하지 않는다면 > 기호를 이용하여 해당 파일을 만들되 연월일을 집어넣은 채로 파일을 생성한 후 열어준다.

기존의 일기장 파일을 삭제한 후 다시 실행해보면 위와 같이 날짜가 적힌 채로 열리는 것을 확인할 수 있다.

 

 

3. 재귀호출을 이용한 폴더 내부 조회하기

 

먼저, nano를 이용하여 tree.sh 파일을 생성하고 아래와 같은 코드를 작성한다.

list_recursive() 함수는 파라미터를 하나 받아서 filepath라는 지역변수에 저장을 하고, 해당 filepath 변수에 든 값을 echo로 화면에 출력한다.

if문을 이용해 해당 파일경로가 존재한다면 file 경로에 존재한다는 메세지를 echo로 날리고 종료한다.

파라미터로 받은 파일이나 경로가 존재하지 않는 경우는 아무 일도 하지 않고, 존재한다면 존재한다는 확인 후에 종료된다.

위와 같이 실행 권한을 준 후 실행해보면 홈 디렉토리 경로는 존재하므로 존재한다는 문구가 출력되고, sandbo라는 경로는 존재하지 않으므로 아무 일도 하지 않는 것을 확인할 수 있다.

 

 

4. 재귀호출 자기자신 호출하기

단순히 해당 경로가 존재하는 것 뿐만 아니라 폴더와 같이 트리형으로 작성된 계층을 순회하도록 하기 위해 아래와 같이 코드를 수정했다.

특정 경로를 받아서 존재한다면 ls를 이용하여 해당 폴더경로 내부의 파일을 fname이라는 반복문 변수에 대입하여 해당 폴더 내부의 fname을 하나하나 출력해준다.

이렇게 하여 특정 경로 하위에 있는 파일들을 모두 출력할 수 있다.

저장 후 실행해보면 위와 같이 홈 디렉토리에 존재하는 파일명들을 출력해주는 것을 확인할 수 있다.

하위 경로를 모두 훑고 다니면서 최종적인 결과를 얻어내기 위해 위와 같이 코드를 수정했다.

특정한 파일경로 존재 시 해당 파일경로를 토대로 다시 list_recursive를 호출한다.

재귀호출을 통해 fname의 하위경로를 호출하지만, -d 옵션이 첫 if문에 걸려 있으므로 폴더가 아니면 따로 추가 재귀가 돌지 않는다.

즉, 폴더인 경우만 재귀호출, 아닌 경우는 파일만 조회해주고 탈출하는 구문이다.

위와 같이 현재 경로 하위에 있는 모든 폴더 및 파일을 다 순회하며 조회하는 것을 확인할 수 있다.

 

 

5. 순회 시 들여쓰기로 계층 표시

들여쓰기를 통해 더욱 가독성 높은 조회를 하기 위해 코드를 아래와 같이 수정했다.

위와 같이 들여쓰기 변수 indent를 생성한다.

처음에는 ""와 같은 빈 문자열을 받지만 내부적으로는 들여쓰기가 들어가도록 파라미터를 전달시킬 수 있다.

filepath##*/은 전방 최장 매치로 패턴에 일치하는 부분을 제거한다. 즉, */에 해당하는 상위 폴더를 나타내는 / 문자를 제거하는 역할을 한다.

실행해보면 위와 같이 들여쓰기가 들어간 채로 잘 출력되는 것을 확인할 수 있다.

 

 

6. 이름에 띄어쓰기가 들어간 파일 추가 처리

현재 작성 구문은 띄어쓰기가 되면 하나의 파일명으로 인식하지 않고, 위와 같이 띄어쓰기 갯수만큼 쪼개진 파일명으로 인식한다.

이는 ls 명령이 띄어쓰기를 파일 구분자로 삼고 있기 때문이다.

내부 필드를 구분할 수 있도록 IFS라는 환경 변수를 조작하여 공백을 내부 문자 구분 기준에서 없애버리는 방식으로 해결할 수 이싿.

위와 같이 IFS에 줄바꿈을 등록하면 더 이상 띄어쓰기를 구분자로 삼지 않는다.

다만, IFS를 바꿔둔 채로 두면 다음 로직에 영향을 줄 수 있기 때문에 모든 호출이 끝나면 IFS 값을 원래 값으로 돌려놓는 조치가 필요하다. 

위와 같이 공백도 구분자가 아닌 하나의 파일로 인식되는 것을 확인할 수 있다.

'네트워크캠퍼스 > LINUX' 카테고리의 다른 글

크론탭 메일전송  (0) 2024.02.21
크론잡과 크론탭  (0) 2024.02.21
Shell Script  (0) 2024.01.17
Devops와 SE를 위한 리눅스 커널 이야기  (0) 2024.01.17
프로세스  (0) 2024.01.16

+ Recent posts